【问题标题】:Emulating the ListBox's MultiSimple SelectionMode for DataGridView为 DataGridView 模拟 ListBox 的 MultiSimple SelectionMode
【发布时间】:2014-03-19 11:53:18
【问题描述】:

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

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

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

建议?

编辑:我已经尝试过这里列出的解决方案:Select multiple Rows without pressing Control Key

此解决方案的问题在于,每次更改选择时屏幕闪烁时看起来很糟糕。我想要一些不会给潜在客户留下不好印象的产品。

在我看来,这样做的唯一方法是能够模拟用户单击时按住控制按钮,或者防止数据网格在用户单击时取消选择其他行。我们将不胜感激有关如何做这些事情的建议。

【问题讨论】:

    标签: c# winforms user-interface datagridview


    【解决方案1】:

    我会覆盖原来的 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,而不必替换它们(尽管我猜反射并不能真正帮助您覆盖方法)。但这肯定会在必要时起作用。
    • 我最终尝试了一个低级鼠标钩子,我发现其他一些代码可以按下/释放控制键几毫秒。它现在似乎运作良好,虽然我有一个偷偷摸摸的怀疑我最终会在一切都说完之前遇到问题。我会给它一周的时间,如果我回到这个解决方案,要么标记你的答案,或者如果它看起来可以继续工作而没有副作用,则发布我的答案。
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多