如何正确发送不同的参数为一个标准的按钮点击

本文关键字:一个 标准 按钮 何正确 参数 | 更新日期: 2023-09-27 18:27:17

我知道这必须有一个简单的答案,但我完全无法理解有关自定义事件、事件处理程序和委托的丰富信息。我有一个自定义的消息框类。如果单击"确定"按钮,我将尝试添加基于复选框状态执行某些操作的功能。按钮和复选框是根据静态Show方法的输入动态添加的,有点像以下方法:

if (!String.IsNullOrWhiteSpace(suicideCheckboxID))
{
    suicideCheckBox = new CheckBox();
    suicideCheckBox.AutoSize = true;
    suicideCheckBox.Text = "Do not show this message again.";
    suicideCheckBox.Location = new Point(xMargin, label.Bottom + yMargin);
    suicideCheckBox.Checked = false;
    suicideCheckBoxHeight = suicideCheckBox.Height;
    form.Controls.Add(suicideCheckBox);
}
Button okButton = NewButton(DialogResult.OK, scaleFactor);
int x = (form.Width - okButton.Width) / 2;
okButton.Location = new Point(x, buttonYPosition);
form.Controls.Add(okButton);
form.AcceptButton = okButton;
form.CancelButton = okButton;

这不是确切的代码,但它相当具有代表性。我的冲动是使用okButton.Clicked += new EventHandler(OKButton_clicked),但如果我这样做,生成的事件只携带object senderEventArgs e的参数,我真的需要它来操作复选框的状态和一段额外的文本来指示显示的消息框,以便将值存储在注册表中。

我的第一次尝试是做类似okButton.Clicked += processSuicideCheckbox(suicideCheckboxID, suicideCheckBox);的事情,但这似乎只是处理内容,并允许返回指向具有object senderEventArgs e签名的方法的EventHandler。我在这里错过了什么?在与我实际相关的论点中,最好的传递方式是什么?

如何正确发送不同的参数为一个标准的按钮点击

您无法为Click事件选择事件处理程序中的内容。微软已经做到了。您被(object sender, EventArgs e)签名卡住了。

你有几个选择:

  1. 只需将状态存储在类本身中;事件处理程序将有权访问它,因为它在类内部。

  2. 利用闭包做同样的事情:

    myButton.Click += (s, e) => ActualFunction(checkBox1.Checked);
    

请注意,使用闭包(通过lambda表达式)只是隐藏了维护此状态(创建类级变量)的细节。

相关文章: