5

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

通过使用 ProcessDialogKey,我设法让它工作得很好,但我仍然有一个问题。我的问题是是否有办法检测 WinForms 控件如何获得焦点,因为我还想知道我的 UserControl 是否从 Tab 或 Shift-Tab 获得焦点,然后做我奇怪的事情,但如果用户单击控件我不想做任何特别的事情。

4

5 回答 5

3

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

现在,说了这么多,我也应客户的要求打破了这个规则。我们使回车键的功能类似于制表键,回车键会将值保存在文本字段中,并将光标移动到下一个字段。

于 2008-08-16T20:55:29.483 回答
1

我不认为有一种内置的方式可以做到这一点。所有的 WinForms 焦点事件(GotFocus、LostFocus、Enter、Leave)都是用空的 EventArgs 参数调用的,它不会给你任何额外的信息。

正如 Rob Thomas 所说,就个人而言,我会禁用第三个文本框。但是,如果您决心这样做,那么设置手动(阅读:hackish)解决方案并不难。一旦按下 tab 键(如果焦点在第二个文本框上),在表单中设置一个变量。如果下一个聚焦的对象是第三个文本框,那么您就知道它是如何发生的了。

于 2008-08-16T21:38:26.090 回答
1

这种奇怪的选项卡行为的原因在于输入过程的速度。获得一些输入真的很好,我没想过禁用文本框,但这实际上可以工作。但是我什至没有想到使用 Enter 键接受输入。这样会好很多。用户可以输入数字,然后按回车键接受输入,下一个可能的文本框将是活动的。就像吃蛋糕一样,速度因素就在那里,因为当使用回车键时,无需进行不必要的制表键即可到达正确的字段,并且使用数字键盘旁边的回车键使其非常流畅。

感谢您的输入!

于 2008-08-17T06:50:14.633 回答
0

我同意丹尼蓝精灵的观点。如果应用程序的要求发生变化,弄乱标签顺序可能会在以后给您带来麻烦。

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

于 2008-08-16T22:02:07.150 回答
0

比禁用控件更好,尝试使用 TabStop 到处乱跑 - 如果这是错误的,则在切换时将简单地跳过控件。

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

我用登录控件做了类似的事情,用户可以输入用户名或电子邮件地址(在单独的字段中),加上他们的密码,而 tabStop 是我用来完成工作的。

于 2008-10-22T20:18:13.167 回答