0

我有一个带有多个参数的 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;
}

编辑:我的主要目标是,我有一个经常使用的对话框,只要对话框上的字段发生更改,就需要在父窗体上调用事件处理程序。除了每次在使用 ShowDialog() 之前实例化一个 New() 对话框并为其事件处理程序分配一个事件之外,还有其他方法吗?

4

2 回答 2

1

好吧,当然,您可以在表单构造函数中传递委托实例,就像名称一样。这样做没有任何好处,代码将与在对话框表单中声明事件非常相似。只是不标准。

于 2010-08-24T17:20:43.127 回答
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,而是使用 Show,因此需要您放置代码以确保对话框保持模态。

于 2010-08-25T06:40:32.667 回答