我有一个由三个文本框组成的用户控件。在表单上我可以有一个或多个用户控件。我想实现我自己的选项卡行为,因此如果用户在第二个文本框中按 Tab,我应该仅在第二个文本框中输入了任何内容时才移动到第三个文本框。如果在第二个文本框中未输入任何内容,则表单的下一个控件应按照正常选项卡行为获得焦点。如果用户没有在第一个或第二个文本框和按下选项卡中输入任何内容,则存在这种特殊情况,即应跳过表单上的控件。

通过使用 ProcessDialogKey 我已经设法使它工作正常,但我仍然有一个问题。我的问题是是否有一种方法可以检测 WinForms 控件如何获得焦点,因为我还想知道我的 UserControl 是否从 Tab 或 Shift-Tab 获得焦点,然后执行我奇怪的操作,但如果用户单击该控件我不想做任何特别的事情。

有帮助吗?

解决方案

作为一般规则,我认为覆盖 TAB 键的标准行为是一个坏主意。也许您可以执行诸如禁用第三个文本框之类的操作,直到在第二个文本框中进行有效输入。

现在,话虽如此,我也应客户的要求打破了这条规则。我们将 Enter 键功能设置为类似于 Tab 键,其中 Enter 键会将值保存在文本字段中,并将光标前进到下一个字段。

其他提示

我不认为有一种内置的方法可以做到这一点。所有 WinForms 焦点事件(GotFocus、LostFocus、Enter、Leave)都是使用空的 EventArgs 参数调用的,这不会为您提供任何附加信息。

就我个人而言,我会禁用第三个文本框,正如罗布·托马斯所说。不过,如果您决心这样做,那么设置一本手册并不困难(请阅读:黑客)解决方案。按下 Tab 键后(如果焦点位于第二个文本框),请在表单内设置一个变量。如果下一个聚焦的对象是第三个文本框,那么您就确切地知道它是如何发生的。

这种奇怪的选项卡行为的原因完全与输入过程的速度有关。获得一些输入真的很好,我没有想过禁用文本框,但这实际上是可行的。但我根本没想过使用 Enter 键来接受输入。这样效果会好很多。用户可以输入数字,然后按 Enter 接受输入,下一个可能的文本框将成为活动文本框。这就像鱼和熊掌不可兼得,速度因素是存在的,因为使用回车键时,无需进行不必要的 Tab 键即可到达正确的字段,并且使用数字键盘旁边的回车键使其非常流畅。

感谢您的投入!

我同意丹尼·斯莫夫的观点。如果应用程序的要求发生变化,弄乱 Tab 键顺序可能会给您带来麻烦。

您可以做的另一件事是实现某种向导以供用户完成。

比禁用控件更好的是,尝试使用 TabStop 进行操作 - 如果这是 false,则在 Tab 键切换时将简单地跳过该控件。

我还建议 TextBox 的 Changed 事件是更新其他控件上的 TabStop 的地方。

我已经使用登录控件完成了类似的操作,用户可以在其中输入用户名或电子邮件地址(在单独的字段中)以及他们的密码,而 tabStop 是我用来完成工作的工具。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top