Другие языки программирования и технологии
Обмен данными между формами C#
Есть 2 формы, форма1 - родительская, в ней данные обрабатываются, форма2 - дочерняя, в ней вводятся данные. Как сделать так, чтобы по внесении нового значения в форме2 она закрывалась, а родительская !узнавала о новом значении! и поднимала соответствующий метод его обработки со всеми вытекающими ?
Можно использовать несколько способов.
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; //использовали переданный в событии аргумент
}
};
}
}
При инициализации дочерним окном события, его получает и обрабатывает главная форма. вместо анонимного делегата можно написать ф-цию обратного вызова с нужной сигнатурой и её связать с событием.
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; //использовали переданный в событии аргумент
}
};
}
}
При инициализации дочерним окном события, его получает и обрабатывает главная форма. вместо анонимного делегата можно написать ф-цию обратного вызова с нужной сигнатурой и её связать с событием.
Сценарий на банальный диалог. События здесь ни к чему.
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)
{
...
}
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)
{
...
}
Похожие вопросы
- обмен данными C# и надежность жесткого диска
- Обмен данными между datagrid viewи базой данных
- Создание базы данных на Turbo C
- С# обмен данными между классами, как это осуществить?
- Зачем и для чего нужен тип данных bool в C++? Пожалуйста, объясните развёрнутым ответом. Заранее спасибо.
- Напишите пожалуйста функцию обмена значений двух переменных на си (не c++) для любого типа данных
- C++ Проверка правильности ввода данных.
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?
- C++. Типы данных. Создание типа данных.
- C++(консоль) Программа, которая выводит данные треугольников со стороной максимум 5000