【发布时间】:2019-02-08 14:10:58
【问题描述】:
在我正在进行的项目中,我创建了一个屏幕键盘,用于输入 TextBoxes 或 DataGridViewCells。
我试图通过一些方法和变量来实现这一点。首先有一个名为CurrentFocus 的全局变量,它是一个对象,它被设置为具有键盘可以输入的最新焦点的任何对象。创建此变量是因为 VB.Net 中似乎没有 LastFocus 样式方法。
我通过向文本框添加简单的事件处理程序来设置CurrentFocus 的值,我将通过以下方式键入数据:
Dim randomTextbox As New Textbox
AddHandler randomTextbox.GotFocus, AddressOf TextboxGainsFocus
Private Sub TextboxGainsFocus(sender as Textbox, e As EventArgs)
CurrentFocus = sender
End Sub
至于输入文本框本身,键盘上的每个键调用以下方法,参数值是被按下的任何键的大写(因此按下'B'键发送“B”作为参数)
Private Sub KeypadPress(ByCal key As Char)
If TypeOf CurrentFocus Is TextBox Then
If Char.IsDigit(key) Then
CType(CurrentFocus, Textbox).Text &= key
Else
If shiftActive Then
CType(CurrentFocus, Textbox).Text &= key
Else
CType(CurrentFocus, Textbox).Text &= Char.ToLower(key)
End If
End If
End If
End Sub
我没有办法轻松设置按住不放的 Shift 键,因此我将“Shift”设置为就像 Caps Lock 一样,您只需将其打开或关闭即可。这就是 shiftActive 布尔值的用途。
现在所有上述代码都可以正常工作。我现在的问题是我无法让它与 DataGridViewCells 一起使用。首先,我尝试将类似的 EventHandler 添加到我正在使用的数据网格中
Dim randomGrid As New DataGridView
AddHandler randomGrid.GotFocus, AddressOf GridGainsFocus
Private Sub GridGainsFocus(sender As DataGridView, e As EventArgs)
CurrentFocus = sender.CurrentCell
End Sub
我已经尝试在KeypadPress 方法中添加一个ElseIf 案例,以检测CurrentFocus 何时是DataGridViewCell。这很好用。我的问题是它要么没有选择正确的单元格,要么就是什么都不做。
例如,假设我的 DataGridView 中有 3 行和 3 列。我选择单元格 (2,2),然后按键盘上的一个键。如果我在KeypadPress 方法触发时设置断点以查看CurrentFocus 的值是多少,它会将CurrentFocus 显示为Cell (0,0)。
但这并不总是发生。有时我确实将它随机(而且看起来确实是随机的)设置为正确的单元格,但尝试像
CType(CurrentFocus, DataGridViewCell).Value &= key
在我的 Keypress 方法中没有做任何事情来改变 DataGridViewCell 的值。
那么我到底需要做什么?有没有办法将每个 Cell 设置为拥有自己的处理程序并让它以这种方式工作?我该如何做才能修改单元格本身的值?
感谢您的帮助。
【问题讨论】:
-
您不使用操作系统屏幕键盘有什么原因吗?
Process.Start(PathToOnScreenKeyboardExecutable)我猜这将完全消除您所描述的任何“焦点”问题,但也会启用“Shift”和任何其他组合键。所有这些都在一行代码中。我并不是要劝阻你不要编写自己的屏幕键盘(恕我直言,这不是微不足道的)......看起来你正在重新发明轮子。 -
@JohnG 长话短说,因为我想我的老板告诉我要在这里重新发明轮子。他不希望单独的应用程序成为键盘,他希望将它内置到我正在创建的应用程序中。
-
@RezaAghaei 您发布的链接中的解决方案不起作用。也许它在 C# 中的工作方式与在 VB.Net 中不同,但即使将按钮
ControlStyles.Selectable设置为 False,键盘按钮仍会获得焦点,并且实际上不会作为虚拟键盘工作。
标签: vb.net datagridview event-handling