我想知道首先会打电话给谁:
void TextBox_MouseClick(object sender, MouseEventArgs e)
base.OnMouseClick(e)
已在控件的源代码中声明; 我想要覆盖标准控件的动作,但我不确定何时在我的代码之后或之前调用基本方法base.OnMouseClick(e)
。
有人可以帮助澄清控制的事件处理程序顺序以做出正确的决定吗?
答案 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);
}