C# 模拟列表框';DataGridView的多简单选择模式

C# 模拟列表框';DataGridView的多简单选择模式,c#,winforms,user-interface,datagridview,C#,Winforms,User Interface,Datagridview,我已将DGV的SelectionMode设置为FullRowSelect,将MultiSelect设置为true 因为这将在触摸屏上使用,用户在选择项目时可能无法通过键盘按住控件或shift按钮,所以我想模拟ListBox在其MultiSimple模式下使用的行为 我想知道最简单的方法是什么。我的第一个想法是捕获鼠标按下事件,然后为用户“按下”控制键,但实际上我不确定我将如何做到这一点。我知道如何使用SendKeys,但我认为这只是按下并释放控制键,而不是让我能够选择何时释放按钮 建议 编辑:我

我已将DGV的SelectionMode设置为FullRowSelect,将MultiSelect设置为true

因为这将在触摸屏上使用,用户在选择项目时可能无法通过键盘按住控件或shift按钮,所以我想模拟ListBox在其MultiSimple模式下使用的行为

我想知道最简单的方法是什么。我的第一个想法是捕获鼠标按下事件,然后为用户“按下”控制键,但实际上我不确定我将如何做到这一点。我知道如何使用SendKeys,但我认为这只是按下并释放控制键,而不是让我能够选择何时释放按钮

建议

编辑:我尝试了下面列出的解决方案:

这种解决方案的问题是,每当您更改选择时,屏幕就会闪烁,这看起来很可怕。我想要一些不会给潜在客户留下坏印象的产品


在我看来,实现这一点的唯一方法是在用户单击时模拟按住控制按钮,或者在用户单击时防止datagrid取消选择其他行。对于如何执行这两项操作的建议,我们将不胜感激。

我将覆盖原始的
DataGridView
类,并更改
OnCellMouseDown
事件

代码如下:

public partial class MyDataGridView : DataGridView
{
    public MyDataGridView()
    {

    }

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    {
        this.Rows[e.RowIndex].Selected = !this.Rows[e.RowIndex].Selected;
    }
}
我在我的机器上用
DataGridView
测试了它,它包含了1000多行,并且运行得很好(没有闪烁)。
这种方法的问题在于
DataGridView
单元格是可编辑的。但是我看不出有什么理由将
MultiSelect
与可编辑单元格组合在一起,这毫无意义。

谢谢。。。我不认为有一种方法可以在不扩展DGV类的情况下实现这一点?如果可能的话,我几乎宁愿使用一些笨重的反射,这样就可以将逻辑应用到现有的DGV,而不必替换它们(尽管我想反射并不能真正帮助您重写方法)。但如果必要的话,这肯定会起作用。我最后尝试了一个低级鼠标钩子,并找到了一些其他代码来按下/释放控制键几毫秒。现在它似乎工作得很好,尽管我有一种隐秘的怀疑,在它被说出来和做出来之前,我最终会遇到问题。我会给它一周的时间,如果我回到这个解决方案,我会给你的答案打上记号,如果它看起来可以继续工作而没有副作用,我会贴上我的答案。