我在 Windows Forms 和 vb.net 中遇到了同样的问题(它可能很容易转换为 c#),我通过以下方式解决了它:
1.将表单 KeyPreview 属性设置为 true。
获取或设置一个值,该值指示在将事件传递给具有焦点的控件之前表单是否会接收键事件。
这允许您只为表单而不是为每个文本框处理键事件。显然,如果您只有一个文本框,这将不会为您节省任何工作。
2。处理表单 KeyUp 事件
看起来 KeyDown 和 KeyPressed 事件不会为 Tab 键触发,但出乎意料的是,KeyUp 会...
我留下我在 KeyUp 事件中使用的代码:
Private Sub MyForm_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
// Do nothing if key other than TAB is pressed
If Not e.KeyCode = Keys.Tab Then Exit Sub
// Search for the control that currently has the focus
// As we are only interested in doing something when the focus is in textboxes, we do not even search the focus for other controls
Dim focused_textbox As TextBox = Nothing
For Each p As TextBox In GetAllTextBoxes(Me) //GetAllTextBoxes is a function that gets a list with all the textboxes for the form passed as a parameter.
If p.Focused Then
focused_textbox = p
Exit For
End If
Next
// If no textbox has the focus, no actions are required.
If focused_textbox Is Nothing Then Exit Sub
// If the textbox with the focus does not have any content, nothing is to be selected....
If String.IsNullOrEmpty(focused_textbox.Text) Then Exit Sub
// select all the textbox contents
focused_textbox.SelectAll()
/* I've also seen arroun the following sollution, instead of the 'focused_textbox.SelectAll()', but I have not tried it, as SelectAll worked perfect for me
focused_textbox.SelectionStart = 0
focused_textbox.SelectionLength = focused_textbox.Text.Length
*/
End Sub
我还给你我的“GetAllTextBoxes”函数,它可能不是最有效的方法,但它有效。
Function GetAllTextBoxes(ByVal control_or_form As Object) As List(Of TextBox)
Dim l As List(Of TextBox) = New List(Of TextBox)
// Fill control_collection with child controls of the control_or_form
Dim control_collection As List(Of Control) = New List(Of Control)
If TypeOf control_or_form Is Windows.Forms.Form Then
Dim form As Windows.Forms.Form = CType(control_or_form, Windows.Forms.Form)
If form.HasChildren Then
For Each c As Control In form.Controls
control_collection.Add(c)
Next
Else
Return l
End If
ElseIf TypeOf control_or_form Is Windows.Forms.Control Then
Dim control As Windows.Forms.Control = CType(control_or_form, Windows.Forms.Control)
If control.HasChildren Then
For Each c As Control In control.Controls
control_collection.Add(c)
Next
Else
Return l
End If
Else
Return l
End If
// At this point if control_or_form is not a control or a form, or if it has no children, the function had already returned an empty list meaning 'this object has no child textboxes'
// Now, for all the child controls, store them into the list if they are TextBoxes and, if not, search more TextBoxes within its childs if it has any.
For Each child_c As Control In control_collection
If TypeOf child_c Is TextBox Then
l.Add(child_c)
End If
If child_c.HasChildren Then
l.AddRange(GetAllTextBoxes(child_c)) //Here we see why this function needs to allow input form and control at the same time
End If
Next
Return l
End Function
希望这对某人有所帮助;)