【问题标题】:calling a event handler within another event handler?在另一个事件处理程序中调用事件处理程序?
【发布时间】:2011-08-25 07:27:04
【问题描述】:

这里是简短的示例代码:

private void txtbox1_DoubleClick(object sender, EventArgs e)
{
    button1_Click(object sender, EventArgs e); //can I call button1 event handler?
}

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(txtbox1.Text);
}

我想知道以上述方式编码是否可以?

【问题讨论】:

  • 你可以,但你真的想要吗?相反,您可以从处理程序中提取公共代码并委托。我觉得它干净了很多。抱歉,没有在下面看到确切的答案 - 这样做!

标签: c# .net event-handling


【解决方案1】:

您可以这样做 - 尽管您提供的代码无法编译。它应该是这样的:

private void txtbox1_DoubleClick(object sender, EventArgs e)
{
    button1_Click(sender, e);
}

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(txtbox1.Text);
}

但为了获得最佳实践和代码可读性,您可能最好这样做,尤其是在您没有使用 sendere 的情况下:

private void txtbox1_DoubleClick(object sender, EventArgs e)
{
    ShowMessageBox();
}

private void button1_Click(object sender, EventArgs e)
{
    ShowMessageBox();
}

private void ShowMessageBox()
{
    MessageBox.Show(txtbox1.Text);
}

【讨论】:

  • hmm,sendere 是否在两个事件处理程序中引用相同的东西?
  • @woodykiddy 否 - txtbox1_DoubleClick 的发送者是 txtbox1,如果事件处理程序已使用 Windows 窗体设计器作为标准连接,则 button1_Click 的发送者将是 button1
【解决方案2】:

是的,您可以这样做;事件处理程序只是另一种方法。

但是,可能值得创建一个显示消息框的新方法,并让两个 Click 事件处理程序都调用它:

private void txtbox1_DoubleClick(object sender, EventArgs e)
{
    ShowTextboxMessage();
}

private void button1_Click(object sender, EventArgs e)
{
    ShowTextboxMessage();
}

private void ShowTextboxMessage()
{
    MessageBox.Show(txtbox1.Text);
}

【讨论】:

  • 嗯,按照你的说法看起来更好。但是,如果我使用嵌套事件处理,会有什么“副作用”吗?我想这或多或少有点令人困惑。
  • 没有副作用,你只是在调用一个方法。
【解决方案3】:

事件处理程序只不过是一种方法,因此您可以像调用任何其他方法一样调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2016-03-22
    • 2011-03-18
    相关资源
    最近更新 更多