在VB.NET项目(.NET 4.0)中,我需要将用户条目限制为DataGridView的单元格中的某些字符。
在EditingControlShowing事件中,我获取列索引并根据列类型添加处理程序(限制日期,数字等)。
这是我的EditingControlShowing事件:
Private Sub dgvEmployees_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dgvEmployees.EditingControlShowing
Dim index As Integer = dgvEmployees.CurrentCell.ColumnIndex
RemoveHandler e.Control.KeyDown, AddressOf NumberOnlyCells_KeyDown
RemoveHandler e.Control.KeyDown, AddressOf DateCells_KeyDown
RemoveHandler e.Control.KeyDown, AddressOf YesNoCells_KeyDown
RemoveHandler e.Control.KeyDown, AddressOf DecimalValueCells_KeyDown
If index = 3 Then
' Dept column
AddHandler e.Control.KeyDown, AddressOf NumberOnlyCells_KeyDown
ElseIf index = 4 OrElse index = 5 OrElse index = 6 Then
' Date columns
AddHandler e.Control.KeyDown, AddressOf DateCells_KeyDown
ElseIf index = 7 OrElse index = 8 Then
' Y/N columns
AddHandler e.Control.KeyDown, AddressOf YesNoCells_KeyDown
ElseIf index = 12 OrElse index = 13 Then
' Goals columns
AddHandler e.Control.KeyDown, AddressOf DecimalValueCells_KeyDown
End If
End Sub
我添加了RemoveHandler行,因为一开始我注意到我的所有KeyDown Subs都被触发了。我还确保索引调用了正确的Sub
这是我的KeyDown潜艇之一
Private Sub YesNoCells_KeyDown(sender As Object, e As KeyEventArgs)
'Console.WriteLine("e.KeyValue: " & e.KeyValue)
' Allow only y, n, delete and backspace keys
If e.KeyValue <> 8 AndAlso
e.KeyValue <> 46 AndAlso
e.KeyValue <> 78 AndAlso
e.KeyValue <> 89 Then
e.SuppressKeyPress = True
End If
End Sub
其余的相似,取决于我需要按下的键,我还在立即窗口中确保我的If / Then逻辑正确评估。
逐步执行此过程,当按下无效字符时,e.SupressKeyPress = True
行会被点击,但无论如何都会在DGV单元格中显示该字符。例如,如果我按下其中一个Y / N列中的数字5(e.KeyValue = 53),则调用上面的Sub并且命中e.SuppressKeyPress = True线,但无论如何5都显示在单元格中。
我还在KeyDown Sub中添加了e.Handled = True
,但这没有任何效果。
我错过了什么?
更新
我发现使用“KeyPress”代替了:
EditingControlShowing事件:
AddHandler e.Control.KeyPress, AddressOf YesNoCells_KeyDown
处理子:
Private Sub YesNoCells_KeyPress(sender As Object, e As KeyPressEventArgs)
Console.WriteLine("e.KeyValue: " & e.KeyChar)
If e.KeyChar.ToString().ToUpper() <> "Y" AndAlso
e.KeyChar.ToString().ToUpper() <> "N" Then
e.Handled = True
End If
End Sub
这很有用,但是据我所知,我必须为每个我想要允许的角色添加一行,加上快速搜索后我找不到KeyChar值对于像Backspace或Del。这样的东西。
我不确定这是最好的方式。
有什么建议吗?
答案 0 :(得分:0)
只需放入按键eventandler
私有Sub MDIParent1_KeyPress(发送者为对象,e作为KeyPressEventArgs)处理Me.KeyPress
e.Handled = True
End Sub
对我有用