Winforms ListView - 双击时停止自动检查

Gar*_*eth 14 .net c# listview winforms

双击时,如何使列表视图不自动检查项目?

我可以尝试挂钩到MouseDoubleClick事件,并将Checked属性设置为false,但这感觉有点像黑客.在实际检查项目时,我还运行了相当昂贵的计算,并且不希望此代码在双击时运行.通过上面的事件挂钩,在处理双击之前会引发ItemCheck和ItemChecked事件.

对此有一个优雅的解决方案吗?

Han*_*ant 12

当你不得不破解本机Windows控件的工作方式时,优雅通常不会突然出现,但这就是这里所需要的.请考虑您是否真的希望您的控件的行为与任何其他程序中的列表视图不同.

在项目中添加一个新类并粘贴下面显示的代码.编译.将新控件从工具箱顶部拖放到表单上.

using System;
using System.Windows.Forms;

class MyListView : ListView {
    protected override void WndProc(ref Message m) {
        // Filter WM_LBUTTONDBLCLK
        if (m.Msg != 0x203) base.WndProc(ref m);
    }
}
Run Code Online (Sandbox Code Playgroud)


Joa*_*kim 12

如果您不想完全关闭DoubleClick消息,只需关闭自动检查行为即可.您可以改为执行以下操作:

public class NoDoubleClickAutoCheckListview : ListView
{
    private bool checkFromDoubleClick = false;

    protected override void OnItemCheck(ItemCheckEventArgs ice)
    {
        if (this.checkFromDoubleClick)
        {
            ice.NewValue = ice.CurrentValue;
            this.checkFromDoubleClick = false;
        }
        else
            base.OnItemCheck(ice);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        // Is this a double-click?
        if ((e.Button == MouseButtons.Left) && (e.Clicks > 1)) {
            this.checkFromDoubleClick = true;
        }
        base.OnMouseDown(e);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        this.checkFromDoubleClick = false;
        base.OnKeyDown(e);
    }
}
Run Code Online (Sandbox Code Playgroud)