Как правильно и красиво, с точки зрения ООП в разрезе C#.Net,
передать значение из одной формы в другую?
Например:
моя mdiForm вызывает Form2.
в Form2 юзер делает выбор в radioButton и нажимает кнопку Ok и Form2 выгружается.
в mdiForm я хочу знать которую из radioButton в Form2 выбрал юзер.
Думаю, что объявление public переменной в mdiForm не самый правильный
и красивый способ решения этой простой задачи.
Здравствуйте, AWRoraInc, Вы писали:
AWR>Как правильно и красиво, с точки зрения ООП в разрезе C#.Net, AWR>передать значение из одной формы в другую?
AWR>Например: AWR>моя mdiForm вызывает Form2. AWR>в Form2 юзер делает выбор в radioButton и нажимает кнопку Ok и Form2 выгружается. AWR>в mdiForm я хочу знать которую из radioButton в Form2 выбрал юзер. AWR>Думаю, что объявление public переменной в mdiForm не самый правильный AWR>и красивый способ решения этой простой задачи.
AWR>Подскажите альтернативу, плиз
Я обычно делаю что-нибудь в стиле:
В Form2:
...
private int _result;
public int Result
{
get
{
return _result;
}
set
{
_result = value;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (radioButton1.Checked) _result = 1;
...
this.Close();
}
...
В Form1:
...
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog();
switch (form2.Result)
{
case 1:
/* что-нибудь делаем */break;
default:
/* и так далее */break;
}
}
...
Спасибо за примеры, но там второе окно открывается как модальное.
А вот у меня случай другой:
MDI_Form открывает дочернее окно (Child_Form) в котором юзер делает выбор.
После этого выбора должны инициализироваться некоторые переменные
(например Connection к базе данных и ряд других),
которые я хочу использовать потом глобально во всем проекте.
Как поступить лучше, красиво и правильно в таком случае с точки зрения C# .Net?
@VRora
Re[2]: а если не открывать второе окно как модальное?
Здравствуйте, AWRoraInc, Вы писали:
AWR>Спасибо за примеры, но там второе окно открывается как модальное. AWR>А вот у меня случай другой: AWR>MDI_Form открывает дочернее окно (Child_Form) в котором юзер делает выбор. AWR>После этого выбора должны инициализироваться некоторые переменные AWR>(например Connection к базе данных и ряд других), AWR>которые я хочу использовать потом глобально во всем проекте.
AWR>Как поступить лучше, красиво и правильно в таком случае с точки зрения C# .Net?
А в дочернем окне ведется редактирование какого-либо документа?
Или просто выбор опций с присвоением значений переменным после нажатия на Ok? Во-втором случае правильнее открывать окно именно модально.
Если я тебя правильно понял, то есть такая мысля:
Объявить некий статический класс со статическими полями, которые будут хранить твои переменные, и обращаться к нему напрямую из
обработчиков контролов на дочерней форме.
Globals.cs
using System;
namespace WindowsApplication1
{
static class Globals
{
private static string _field;
public static string Field
{
get { return _field; }
set { _field = value; }
}
}
}
ChildForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class ChildForm : Form
{
public ChildForm()
{
InitializeComponent();
}
private void radioButton_Click(object sender, EventArgs e)
{
Globals.Field = ((RadioButton)sender).Text;
}
}
}
Вообще более правильно с точки зрения ООП сделать класс Globals нестатическим, создать конкретный объект в главной форме и передать ссылки на него дочерним формам через их конструкторы. Но это гораздо геморройнее
Кстати в готдотнетовском факе(см. пост Сергея) есть пример с немодальными формами. Но там значения переменным тоже присваиваются именно при закрытии формы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: а если не открывать второе окно как модальное?
Здравствуйте, AWRoraInc, Вы писали:
AWR>После этого выбора должны инициализироваться некоторые переменные AWR>(например Connection к базе данных и ряд других), AWR>которые я хочу использовать потом глобально во всем проекте.
AWR>Как поступить лучше, красиво и правильно в таком случае с точки зрения C# .Net?
Сохрани это всё в переменных, из которых ты это будешь использовать глобально, и затем вызови событие, чтобы обновились все заинтересованные подписчики.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: а если не открывать второе окно как модальное?
Спросонья не вспомнил, что тебе собственно надо.
Тебе надо подписать mdiForm на эвент Closed формы Form2 и в его обработчике инциализировать свои переменные.
Пример есть по ссылке в посте Сергея.