如何使用自定义ShowDialog在winfowms中分配事件处理程序?

时间:2010-08-24 16:35:16

标签: .net winforms event-handling showdialog

我有一个带有几个参数的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()之前为其事件处理程序分配事件之外,有没有办法做到这一点?

2 个答案:

答案 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,但显示相反,因此要求您设置代码以确保对话框保持模态。