我在此处的其他地方读到,要在文本框中捕获“Enter”击键并像按下按钮一样使用它,我应该将表单的 KeyPreview 属性设置为 true 并检查 KeyDown 的值。
我希望能够在多个 TextBox 控件上使用此功能,每个控件都与不同的 Button 关联。
我的问题是如何知道哪个控件导致了 KeyPress 事件? 发件人被列为表单本身。
G
我找到了一个似乎有效的解决方案。
private void DeviceForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13 && tstxtDeviceFilter.Focused)
{
filterByDeviceSN();
}
}
我忍不住想一定有更好的方法!
--编辑--编辑--编辑--编辑--编辑--
嗯,在查看了下面的建议(谢谢)之后,我在这种情况下找到了一种“更好”的方法。
this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown);
private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 13)
{
filterByDeviceSN();
}
}
显然,通过将事件捕获在文本框本身而不是表单上,我不需要担心焦点。我再次为这么久没有想到这一点而感到愚蠢!
每个表单都有一个“接受”按钮和“取消”按钮的属性,这些按钮分别是当用户按下 Enter 和 Escape 时“单击”的按钮。
您可以在每个控件获得焦点时更改默认按钮(每个按钮可以有一个获得焦点事件处理程序,并与一组文本框共享)
如果执行此操作,按钮的外观会发生变化,为用户提供视觉提示,告诉他们哪个按钮是默认按钮。
或者,如果您不想这样做,可以使用“ActiveControl”属性,并测试它属于哪一组文本框。
您是否问过自己,如果不是这些文本框之一,默认按钮应该是什么?
你尝试过Form.ActiveControl吗?
当表单尝试关闭时,关闭验证并执行另一次关闭。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (ActiveControl.CausesValidation) // Test or it's an infinite loop!
{
ActiveControl.CausesValidation = false;
Close();
}
}
您可以使用此代码作为捕获表单的按键事件的起点。 ActiveControl 是焦点之一。在此示例中,当您位于表单上的不同文本框中时,可以灵活地在“Enter”上添加其他操作。它是 VB.NET,但您应该能够轻松转换为 C#。
Private Sub MyForm_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Enter Then
If Me.ActiveControl.Name = Me.TextBox1.Name Then
' This is the TextBox we want to be active to run filterByDeviceSN()
filterByDeviceSN()
ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then
foo()
End If
End If
End Sub