C# WinForm控件事件处理程序顺序

C# WinForm控件事件处理程序顺序,c#,winforms,events,custom-controls,C#,Winforms,Events,Custom Controls,我不明白谁会先打电话来: 标准事件hadler订户方法,如void TextBox\u MouseClickobject sender、MouseEventArgs e 控件的本机处理程序aka base.OnMouseClicke,已在控件的源代码中声明; 我不想重写standart控件的操作,但我不确定何时在代码之后或之前调用base.OnMouseClicke基方法 是否有人可以帮助澄清控件的事件处理程序顺序,以便做出正确的描述 public class MyTextBox : TextB

我不明白谁会先打电话来:

标准事件hadler订户方法,如void TextBox\u MouseClickobject sender、MouseEventArgs e 控件的本机处理程序aka base.OnMouseClicke,已在控件的源代码中声明; 我不想重写standart控件的操作,但我不确定何时在代码之后或之前调用base.OnMouseClicke基方法

是否有人可以帮助澄清控件的事件处理程序顺序,以便做出正确的描述

public class MyTextBox : TextBox
{
    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);
        BackColor = Color.Red;
    }
}
现在鼠标点击文本框的背景色将变为红色。现在我们想改变这种行为,我们希望鼠标点击时显示绿色

public class MyTextBox1 : MyTextBox
{
    protected override void OnMouseClick(MouseEventArgs e)
    {            
        base.OnMouseClick(e);
        BackColor = Color.Green;
    }
}
如果你打电话给base.OnMouseClicke,下面是你问题的答案;首先,您想要的结果将是绿色的,如果您调用base.OnMouseClicke;最后你的最终结果将是红色的,就像在基类中一样

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

}
调用事件处理程序。实际上,正如您从文档中看到的,它不做任何其他事情:

引发鼠标单击事件

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

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的约定(例如,在不调用base方法的情况下重写它),则这可能不起作用。

OnMouseDown基本上只负责引发MouseDown事件。这是在控制类的OnMouseDown方法中执行的操作:

然后根据需求,子控件重写OnMouseDown以执行某些操作。例如:

DataGridView会覆盖它,首先调用base.OnMouseDown ad,然后点击测试检查是否在单元格上进行了鼠标下移,然后调用OnCellMouseDown。 ToolStrip会覆盖它,并且first hit会测试鼠标位置,以检查它是否位于引发ToolStripItem的MouseDown事件的项目上。否则它将调用base.OnMouseDown。
重要提示:请记住,在重写OnMouseDown时,如果不调用base.OnMouseDown,则基本控件的OnMouseDown方法中存在的自定义逻辑将不会运行。此外,MouseDown事件将不会引发

这取决于你控制的需要。是的,我得到了这个。但是,如果我将订阅MyTextBox。在某个类中单击,将首先调用基方法还是在某个类中调用事件处理程序?如果使用此控件并订阅,则将自动调用鼠标单击事件基方法。然后,如果在自定义控件重写方法中不调用base.OnMouseDown,则该控件的MouseDown事件将不会发生如果不调用base.OnMouseDown,基本控件中可能存在的自定义逻辑将不会运行。此外,MouseDown事件将不会引发!
protected virtual void OnMouseDown(MouseEventArgs e) {
    Contract.Requires(e != null);
    MouseEventHandler handler = (MouseEventHandler)Events[EventMouseDown];
    if (handler != null) handler(this, e);
}