Вы можете назначать события и обработчики событий так, как вам нравится. Вот пример кода. Есть две формы, каждая с кнопкой и меткой. Form2 имеет текстовое поле, в которое вы можете ввести tesxt.
При нажатии на кнопку в Form2 она меняет текст метки и запускает событие, полученное Form1. Метка в Form1 затем изменяется в соответствии с меткой в Form2.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 dlg = new Form2();
dlg.NameChanged += OnNameChanged;
dlg.ShowDialog();
}
private void OnNameChanged(object sender, NameChangeEventArgs args)
{
this.label1.Text=args.NewName;
}
}
public class NameChangeEventArgs : EventArgs
{
public NameChangeEventArgs(string name)
{
this.NewName=name;
}
public string NewName{get;private set;}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = textBox1.Text;
if (this.NameChanged != null)
{
this.NameChanged(this, new NameChangeEventArgs(label1.Text));
}
}
public event EventHandler<NameChangeEventArgs> NameChanged;
}
}
edit - Извините, я не правильно прочитал ваш вопрос.
Если вы хотите избежать этого
Form2 dlg = new Form2();
dlg.NameChanged += OnNameChanged;
dlg.ShowDialog();
Тогда вы можете изменить конструктор Form2 на:
public Form2(EventHandler<NameChangeEventArgs> eventhandler)
{
InitializeComponent();
NameChanged += eventhandler;
}
А затем вы настраиваете и показываете Form2 следующим образом:
Form2 dlg = new Form2(OnNameChanged);
dlg.ShowDialog();
К сожалению, в настоящее время действительно есть способ избежать оператора +=
при назначении обработчиков событий, поскольку они должны назначаться после создания экземпляра родительского класса.
Конечно, вы можете создать экземпляр диалогового окна один раз и просто не показывать его до тех пор, пока он не потребуется, но тогда вам придется справиться с закрытием и уничтожением диалогового окна, что означает не использование ShowDialog, а вместо этого Show, требующий от вас применения кода, чтобы гарантировать, что диалог остается модальным.