我有一个带有几个参数的ShowDialog。有没有办法同时传递一个委托来处理父表单上的事件? (而不是实例化对话框,然后添加事件,然后调用默认的ShowDialog)
简化示例,如果我想在对话框上进行更改以立即反映在开头表格上:
public event NameChangeEventHandler OnChange;
internal DialogResult ShowDialog(string pPersonName)
{
using (diagSample dialog = new siagSample(pPersonName)
{
DialogResult result = dialog.ShowDialog();
return result;
}
}
public diagSample(string pPersonName)
{
InitializeComponent();
_PersonName = pPersonName;
}
编辑:我的主要目标是,我有一个经常使用的对话框,只要对话框中的字段发生更改,就需要在父窗体上调用事件处理程序。除了实例化New()对话框并在每次使用ShowDialog()之前为其事件处理程序分配事件之外,有没有办法做到这一点?
答案 0 :(得分:1)
当然,您可以在表单构造函数中传递委托实例,就像名称一样。这样做没有任何好处,代码与在对话框表单中声明事件非常相似。只是非标准。
答案 1 :(得分:0)
您可以根据需要分配事件和事件处理程序。这是一些示例代码。有两种形式,每种形式都有一个按钮和一个标签。 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,但显示相反,因此要求您设置代码以确保对话框保持模态。