您可以随意分配事件和事件处理程序。这是一些示例代码。有两个表单,每个表单都有一个按钮和一个标签。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;
}
}
编辑 - 抱歉,我没有正确阅读您的问题。
如果你想避免这种情况
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,因此需要您放置代码以确保对话框保持模态。