我在表单(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?任何帮助和代码示例都将不胜感激。
最基本的问候
答案 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。