Я бы передал объект конструктору. Объект, содержащий некоторые свойства, и когда это свойство установлено, он инициирует событие для всех слушателей, которые затем могут обновить свой экран. Преимущество этого метода в том, что Form2 не зависит от Form1 (развязан). Form2 по-прежнему можно использовать, например, в Form3, если вызывающий объект передает действительный объект DataObject.
Вот пример использования INotifyPropertyChanged
I have 2 forms.
- form1 has a TextBox and two buttons (one is Set Title property, the other is open form2)
- form2 has a Label, which is only showing the property.
So form1 set the property of the data object, form2 listens to the propertychanged event.
public partial class Form1 : Form
{
private readonly DataObject _dataObject = new DataObject();
public Form1()
{
InitializeComponent();
}
private void buttonOpenForm2_Click(object sender, EventArgs e)
{
// pass the DataObject into the constructor.
var form2 = new Form2(_dataObject);
form2.Show();
}
private void buttonSetTitle_Click(object sender, EventArgs e)
{
_dataObject.Title = textBox1.Text;
}
}
public partial class Form2 : Form
{
private DataObject _dataObject;
// here the dataobject is passed to this form
public Form2(DataObject dataObject)
{
InitializeComponent();
_dataObject = dataObject;
_dataObject.PropertyChanged += DataObject_PropertyChanged;
// deregister the event on close
FormClosed += (s, ee) => _dataObject.PropertyChanged -= DataObject_PropertyChanged;
UpdateTitle();
}
// a method responsible for updating the gui.
private void UpdateTitle() =>
label1.Text = _dataObject.Title;
private void DataObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(DataObject.Title):
UpdateTitle();
break;
}
}
}
public class DataObject : INotifyPropertyChanged
{
private string _title;
public string Title
{
get { return _title; }
set
{
_title = value;
// here the event is fired.
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}