WinForm控件事件处理程序命令

时间:2018-04-03 09:19:28

标签: c# winforms events custom-controls

我想知道首先会打电话给谁:

  • Standart事件hadler订阅者方法,如void TextBox_MouseClick(object sender, MouseEventArgs e)
  • Control的本机处理程序aka base.OnMouseClick(e)已在控件的源代码中声明;

我想要覆盖标准控件的动作,但我不确定何时在我的代码之后或之前调用基本方法base.OnMouseClick(e)

有人可以帮助澄清控制的事件处理程序顺序以做出正确的决定吗?

3 个答案:

答案 0 :(得分:2)

Control.OnMouseClick调用事件处理程序。实际上,正如您从文档中看到的那样,它什么都不做:

  

引发MouseClick事件。

因此,您应该能够以相对简单的方式控制执行顺序:

protected override void OnMouseClick(MouseEventArgs e)
{
    Console.WriteLine("Before handlers");
    base.OnMouseClick(e);
    Console.WriteLine("After handlers");
}

void TextBox_MouseClick(object sender, EventArgs e)
{
    Console.WriteLine("Handler");
}    

如果您的某个父控件违反了OnMouseDown的合同(例如,在不调用基本方法的情况下覆盖它),则可能无效。

答案 1 :(得分:2)

OnMouseDown基本上只负责举起MouseDown事件。这是OnMouseDown类的Control方法中所做的:

protected virtual void OnMouseDown(MouseEventArgs e) {
    Contract.Requires(e != null);
    MouseEventHandler handler = (MouseEventHandler)Events[EventMouseDown];
    if (handler != null) handler(this, e);
}

然后根据要求,子控件覆盖OnMouseDown来执行某些操作。例如:

  • DataGridView会覆盖它,然后首先调用base.OnMouseDown ad,然后点击测试以检查是否已在单元格上完成鼠标按下,然后调用OnCellMouseDown
  • ToolStrip会覆盖它并首先点击测试鼠标位置,以检查它是否在MouseDown ToolStripItem事件引发的项目上。 否则会调用base.OnMouseDown

重要提示:请注意,如果您未调用OnMouseDown,请覆盖base.OnMouseDown,然后调用OnMouseDown方法中存在的自定义逻辑基本控件不会运行。此外,MouseDown事件不会引发!

答案 2 :(得分:0)

public class MyTextBox : TextBox
{
    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);
        BackColor = Color.Red;
    }
}

现在点击鼠标,Textbox的背景颜色将变为红色。现在我们想要在鼠标单击中更改我们想要绿色的这种行为。

public class MyTextBox1 : MyTextBox
{
    protected override void OnMouseClick(MouseEventArgs e)
    {            
        base.OnMouseClick(e);
        BackColor = Color.Green;
    }
}

如果你打电话给base.OnMouseClick(e),这是你的问题的答案;首先,你想要的结果将是绿色,如果你打电话给base.OnMouseClick(e);最后你的最终结果将是基类中的红色。

protected override void OnMouseClick(MouseEventArgs e)
{
     BackColor = Color.Green;
     base.OnMouseClick(e);

}