.net Multiselect DataGridView不带CTRL键且不闪烁?

.net Multiselect DataGridView不带CTRL键且不闪烁?,.net,vb.net,winforms,datagridview,.net,Vb.net,Winforms,Datagridview,我在表单(Form1.vb)上有一个DataGridView控件,需要允许用户在不使用CTRL键的情况下多选择行(没有可用的键盘-他们使用的是触摸屏)。我已经启用了mutliselect属性,并且在我的表单类中有以下代码 我的DataGridView称为dgvOEE,我已经创建了一个选定行的列表,在通过“CellClick”事件单击行时,我将这些行添加到该列表中并将其删除。然后,我通过PerformSelection例程选择行 Private selectedRows As New List(O

我在表单(Form1.vb)上有一个DataGridView控件,需要允许用户在不使用CTRL键的情况下多选择行(没有可用的键盘-他们使用的是触摸屏)。我已经启用了mutliselect属性,并且在我的表单类中有以下代码

我的DataGridView称为dgvOEE,我已经创建了一个选定行的列表,在通过“CellClick”事件单击行时,我将这些行添加到该列表中并将其删除。然后,我通过PerformSelection例程选择行

Private selectedRows As New List(Of DataGridViewRow)

 Private Sub dgvOEE_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvOEE.CellClick
    If (selectedRows.Contains(dgvOEE.Rows(e.RowIndex))) Then
        selectedRows.Remove(dgvOEE.CurrentRow)
    Else
        selectedRows.Add(dgvOEE.CurrentRow)
    End If
    PerformSelection()
End Sub

Private Sub PerformSelection()
    For Each dgvRow As DataGridViewRow In dgvOEE.Rows
        If (selectedRows.Contains(dgvRow)) Then
            dgvRow.Selected = True
        Else
            dgvRow.Selected = False
        End If
    Next
End Sub
此方法的问题在于,每次用户单击任何单元格时,它都会取消选中/取消选中任何已选中的内容,然后运行我的代码。它会引起“闪烁”。我认为我需要捕获/覆盖DataGridView鼠标向下。我看到的例子是这样的(我可以将其放入我当前的表单类中,但如何实现类似的内容来捕获表单上DataGridView的事件??此示例创建了一个名为MyDataGrid的类,该类继承DataGridView并应捕获OnCellMouseDown,但不确定该类在我的表单类中如何工作(如何实现?)

也许是某种事件处理程序?任何帮助和代码示例都将不胜感激


如果您覆盖OnMouseDown和OnMouseUp方法,那么创建DataGridView的子类将起作用,如下所示:

Public Class SimpleMultiselectDataGridView
    Inherits DataGridView

    Protected Overrides Sub OnCellMouseDown(e As DataGridViewCellMouseEventArgs)
        Me.Rows(e.RowIndex).Selected = Not Me.Rows(e.RowIndex).Selected
    End Sub

    Protected Overrides Sub OnCellMouseUp(e As DataGridViewCellMouseEventArgs)
    End Sub
End Class

然后,您可以简单地将DataGridView的类型更改为SimpleMultiselectDataGridView。

对不起,我收回了我的答案,因为这是一堆BS。我已经查看了覆盖
OnCellMouseDown
事件的情况,但我看不到一种明显的方法,可以在没有control键的情况下进行选择……如果您找到解决方案,请发布back、 你能跟踪两次点击和一系列单元格吗?谢谢你,兰斯。我用它创建了一个类,并找到了如何在窗体上绘制DataGridView而不必从工具箱中拖动它。现在,通过处理OnCellMouseDown,网格绘制-选择点击的每一行-不闪烁。但是,网格点击事件和其他注册表除非调用MyBase.OnCellMouseDown,否则不会调用代理。这当然会弄乱所选行的绘制-取消我首先尝试执行的操作。因此,我刚刚从这个重写的子项引发了我自己的单击事件,它工作得很好!再次感谢
Public Class SimpleMultiselectDataGridView
    Inherits DataGridView

    Protected Overrides Sub OnCellMouseDown(e As DataGridViewCellMouseEventArgs)
        Me.Rows(e.RowIndex).Selected = Not Me.Rows(e.RowIndex).Selected
    End Sub

    Protected Overrides Sub OnCellMouseUp(e As DataGridViewCellMouseEventArgs)
    End Sub
End Class