使用C#与SubItemClicked干扰上一个ListView防止ItemChecked事件(Pr

2019-10-23 07:12发布

我使用的是就地编辑列表视图中的项目控制。

可编辑的列表视图增加​​了一个“SubItemClicked”事件,使得每个“单元”可以被编辑。

lstSD2.SubItemClicked += new ListViewEx.SubItemEventHandler(lstSD2_SubItemClicked);

我也有一个“ItemChecked”事件启用列表视图复选框。

问题是,在任何行一旦启用了“ItemChecked”事件双击打响“ItemChecked”事件,防止“SubItemClicked”事件烧制而成。

有没有办法强制执行需要真正“检查”列表视图复选框,而不是射击每当行双击?

一个可能的解决办法是禁用ListView的“DoubleClickActivation”:

this.lstShuntData2.DoubleClickActivation = false;

这个主要的缺点是用户可能会发现列表视图一点点鼠标点击任何过于敏感。

Answer 1:

.NET特别添加此功能到ListView。 不要问我为什么。

为了摆脱它,听NM_DBLCLK反射通知,并在处理程序为做到这一点::

NativeMethods.NMHDR nmhdr = (NativeMethods.NMHDR)m.GetLParam(typeof(NativeMethods.NMHDR));

switch (nmhdr.code) {
case NM_DBLCLK:
    // The default behavior of a .NET ListView with checkboxes is to toggle the checkbox on
    // double-click. That's just silly, if you ask me :)
    if (this.CheckBoxes) {
        // How do we make ListView not do that silliness? We could just ignore the message
        // but the last part of the base code sets up state information, and without that
        // state, the ListView doesn't trigger MouseDoubleClick events. So we fake a
        // right button double click event, which sets up the same state, but without
        // toggling the checkbox.
        nmhdr.code = NM_RDBLCLK;
        Marshal.StructureToPtr(nmhdr, m.LParam, false);
    }
    break;

这是,在众多问题中的一个ObjectListView解决了你。 即使你不使用整个项目,你可以看看源代码,并找出如何自己做的事情。



文章来源: Prevent ItemChecked event on a ListView from interfering with SubItemClicked using C#