我在VB.Net中创建了一个类,它是DataGridView
的子级。我正在尝试创建一个方法,该方法检测左键单击某个列标题的时间,然后检查单击事件触发时是否按下了CTRL键。这是我迄今为止的代码:
Private Sub Self_ColumnHeaderLeftClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles Me.ColumnHeaderMouseClick
If e.Button <> MouseButtons.Left Then Return
If (Control.ModifierKeys = (Keys.LControlKey Or Keys.RControlKey) Then
MessageBox.Show(Columns(e.ColumnIndex).Name)
EndIf
End Sub
现在假设它很简单,只要按住CTRL键并左键单击其中一个标题,就会弹出一个消息框。然而,什么也没发生。我知道事件方法正在启动,因为如果我将MessageBox
行移动到If
语句下的Else
块中,就会出现消息框。我做错了什么?
Control.ModifierKeys
的类型为System.Windows.Forms.Keys
,它是用FlagsAttribute
注释的枚举类型。你可能想测试一种情况,比如:
(Control.ModifierKeys AND Keys.LControlKey = Keys.LControlKey) OR (Control.ModifierKeys AND Keys.RControlKey = Keys.RControlKey)
这个表达式的前半部分说"是Control.ModifierKeys
中设置的Keys.LControlKey
的所有位。后半部分对Keys.RControlKey
做同样的事情。
您可能会根据自己的需求调整
Private Sub SomeDGV_ColumnHeaderMouseClick(sender As Object,
e As DataGridViewCellMouseEventArgs) Handles dgvPending.ColumnHeaderMouseClick
If e.Button = Windows.Forms.MouseButtons.Left Then
If My.Computer.Keyboard.CtrlKeyDown Then
'control key down
Else
'
End If
End If
End Sub
条件应该是
Control.ModifierKeys = Keys.LControlKey Or Control.ModifierKeys = Keys.RControlKey
因为Keys.LControlKey Or Keys.RControlKey
组合两个Keys
值以形成包含LControlKey
和RControlKey
两者的新值。这意味着您必须同时按下两个控制键。
请参阅:使用带位标志的枚举值来处理多个选项
好吧,不管你按哪个控制键,看起来你都得到了Keys.Control
。所以只需测试
if Control.ModifierKeys = Keys.Control Then