Другие языки программирования и технологии

Обмен данными между формами C#

Есть 2 формы, форма1 - родительская, в ней данные обрабатываются, форма2 - дочерняя, в ней вводятся данные. Как сделать так, чтобы по внесении нового значения в форме2 она закрывалась, а родительская !узнавала о новом значении! и поднимала соответствующий метод его обработки со всеми вытекающими ?
Aidar Kurman
Aidar Kurman
817
Можно использовать несколько способов.
1)В конструктор одной формы передать ссылку на другую форму и получить к ней доступ.
2)Создать промежуточный класс, доступный из двух форм. в него помещать данные из одной формы и биндить его из другой.
3)Использовать статические перменные.
Но я бы предложил использовать механизм событий.
Что для этого нужно.
1)Создать свой класс события и событийного аргумента.
public delegate void StringHandler(object sender, StringArg ar);
public class StringArg : EventArgs //аргумент события
{
public string str;
public StringArg(string s)
{
str = s;
}
}
public class StringEvent //класс события
{
public event StringHandler evt;
public void OnStringEvt(string s)
{
if (evt != null)
evt(this, new StringArg(s));
}
}

2)У формы два членом сделать твоё событие
public partial class Window2 : Window
{
public StringEvent evt = new StringEvent();
....
private void button1_Click(object sender, RoutedEventArgs e)
{
evt.OnStringEvt(textBox1.Text); //по нажатии на кнопку вызываем наше событие, где параметром нужная строка
this.Close(); //закрываем форму
}

}

3)В родительской форме обрабатываем событие
public partial class Window1 : Window
{
....
void OpenWin2(object sender, RoutedEventArgs e)
{
Window2 w2 = new Window2();
w2.Show();
w2.evt.evt += delegate(object o, StringArg ar) //используем анонимный делегат для упрощения кода
{
if (ar.str != null)
{
this.textBox1.Text=ar.str; //использовали переданный в событии аргумент
}
};
}
}
При инициализации дочерним окном события, его получает и обрабатывает главная форма. вместо анонимного делегата можно написать ф-цию обратного вызова с нужной сигнатурой и её связать с событием.
ПИ
Падишах Иванов
9 759
Лучший ответ
Сценарий на банальный диалог. События здесь ни к чему.

class MyDialog : Form
{
...
public string MyData
{
get { return myTextBox.Text }
set { myTextBox.Text = value }
}
}

MyDialog dialog = new MyDialog();
dialog.Mydata = "Initial data value";

DialogResult result = dialog.ShowDialog();
if (result == DialogResult.OK)
{
...
}