编辑* 好的抱歉没有给出真实的情景,
实际上我以编程方式创建了datagridview,我放了2个事件,即 mouseclick 和 ColumnHeaderMouseClick 。
目前,只要用户点击列标题,它就会先触发鼠标点击,然后再触发 ColumnHeaderMouseClick
我可以改变触发器的顺序吗?或者我可以知道用户点击的时候我可以检查他是否点击了列标题或其他位置" mouseclick event"?
答案 0 :(得分:1)
我不知道有什么方法可以做到这一点。事件根据实际发生的事件发生。换句话说,就像说你可以先走一扇门而不先打开它。它在上下文中并没有意义。
您是否可以切换要呼叫的代码并单击?或者只是使用点击并按照您喜欢的顺序执行事件?
答案 1 :(得分:1)
你不能这样做,它没有逻辑意义。 MouseDown
事件必然发生在MouseClick
事件之前,因为鼠标按钮必须关闭才能启动点击。当鼠标按钮停止时,会引发MouseDown
事件。直到之后的那段时间才能提出MouseClick
事件。
鼠标事件的顺序为explicitly documented on MSDN,无法修改。
你说这只是一个例子,你正在研究其他事件。不幸的是,答案无论如何都是一样的。引发事件的顺序是由编写引发这些事件的代码的程序员决定的。您(图书馆的消费者)没有机制来改变该顺序。
与上面讨论的鼠标事件一样,the MSDN documentation列出了WinForms库引发的所有重要事件的顺序。
当然,如果你正在编写引发事件的代码,你可以随时修改它以按照你想要的顺序提升它们。但我怀疑这很明显,而不是你提出这个问题的原因。
答案 2 :(得分:0)
大多数C#实现通常会按照它们在每个事件中注册的顺序触发事件处理程序。 但是这没有强制执行!
它可以随时更改,因此您不应该在应用程序中创建对事件处理程序顺序的依赖。
我强烈建议您退后一步,检查您的应用程序设计,了解如何消除此依赖关系。
答案 3 :(得分:0)
正如许多人在答案中建议的那样,由于多种原因,不建议更改事件顺序。
为了实现您的目标,您必须重新实现.NET Framework的Windows窗体控件。您还可以通过覆盖WndProc
过程并直接处理操作系统提供的消息来尝试劫持Windows消息处理,但您将了解到事件触发顺序遵循操作系统发送输入的顺序。设备(鼠标)到受影响的窗口/控件。
答案 4 :(得分:0)
我已经得到了解决方案,我得到了行的索引,如果为-1它的意思是它是一个标题所以我可以做if if已经,不需要不同的事件,足够单独的单击事件可以处理这两种情况 抱歉,当解决方案如此简单时,请以复杂的方式询问,感谢您的帮助。