多选DataGridView没有CTRL键,没有闪烁?

时间:2014-07-30 21:33:12

标签: .net vb.net winforms datagridview

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

我的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 mousedown。我见过的例子是这样的(我可以把它放到我当前的表单类中,但是如何实现这样的东西来捕获我的表单上的DataGridView的事件?这个例子创建了一个名为MyDataGrid的类,它继承了DataGridView并且应该捕获OnCellMouseDown,但不确定我的表单类中的这个类是如何工作的(如何实现?)

Public Class MyDataGrid
    Inherits DataGridView

    Protected Overrides Sub OnCellMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnCellMouseDown(e)
    End Sub
End Class 

也许某个EventHandler?任何帮助和代码示例都将不胜感激。

最基本的问候

1 个答案:

答案 0 :(得分:1)

如果您重写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。