我的公司有一个用 VB6 编写的大型应用程序,由于历史原因,该应用程序是使用 Enter 键而不是 Tab 键进行导航的。我不了解 VB6,但我知道他们当前在表单的 KeyUp 事件中的一个大选择语句中为每个控件设置焦点(如果它是 EnterKey)。现在我们开始转换为 .NET,并且必须保持一致,以便用户不必在某些表单上按 TAB 键,而在其他表单上按 ENTER 键。我想编写祖先表单,它会自动从一个字段输入到另一个字段,而不是制表符。一位同事告诉我,VB6 中的处理方式是不在 CLICK 事件上处理按钮,而是在 KEYUP 事件上处理按钮。我需要继续执行此操作,以便在表单完成后我不会将剩余的 KeyUp 事件传递回 VB6。按钮的事件顺序是
- button_PreviewKeyDown
- button_Click(显然取代了 KeyPress 事件)
- form_KeyUp
- button_KeyUp
我创建的表单如下:
- 在 ANCESTOR 表单的 KeyUp 事件中,检查它是否是 Enter 键。如果它是 Enter 键,并且事件控件不是按钮,它将按 Tab 键顺序移动到下一个字段。否则它会忽略该键并让控件处理它。如果它是一个按钮,祖先不会假定知道按钮想要控制去哪里,因为它将取决于按钮被“单击”时想要执行的操作。
- 在 CHILD 窗体的按钮上,单击事件不执行任何操作,并且在 KeyUp 事件和 MouseClick 事件中重复进行处理。
- ANCESTOR 表单有一个 protected bool 值 EatKeyUp,可以由 CHILD 将其设置为 True。当子窗体需要发送 MessageBox 时使用,因为如果用户通过 MessageBox 上的 OK 按钮输入,仍然有一个剩余的 KeyUp 事件将被祖先窗体消耗。
虽然很笨拙,但这似乎确实有效。我想知道的是,有没有更好的方法?也许我可以在某个地方告诉我的应用程序“通过表单输入而不是制表符输入”?我使用的事件(而不是点击事件)是最好的吗?
最佳答案
更好的实现是使用表单的 AcceptButton 属性,将其设置为表单上某处的隐藏按钮。然后,当用户按下 Enter 键时,单击按钮,然后在按钮单击事件中执行代码以移至下一个控件。要选择下一个控件,您只需通过项目列表进行选择即可。
最简单的方法是创建一个基本表单,然后在其中包含按钮和 AcceptButton 逻辑。
关于.net - 如何使用 Enter 键在字段之间导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/196603/