覆盖WinForms中的选项卡行为

时间:2008-08-16 20:48:01

标签: c# .net winforms

我有一个UserControl,包含三个TextBoxes。在表单上我可以有一个或多个或我的UserControl。我想实现我自己的选项卡行为,所以如果用户在第二个TextBox中按Tab键,我应该只移动到第三个TextBox,如果第二个TextBox输入了任何内容。如果在第二个TextBox中没有输入任何内容,则表单的下一个控件应按照常规选项卡行为获得焦点。如果用户没有在第一个或第二个TextBox和press选项卡中输入任何内容,则会出现这种特殊情况,即应跳过表单上的控件。

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

5 个答案:

答案 0 :(得分:3)

作为一般规则,我会说重写TAB键的标准行为是个坏主意。也许你可以做一些事情,比如禁用第三个文本框,直到在第二个文本框中输入有效的条目。

现在,说了这句话,我也应客户的要求打破了这条规则。我们使用键盘键输入键功能,其中输入键将值保存在文本字段中,然后将光标前进到下一个字段。

答案 1 :(得分:1)

我认为你没有内置的方法可以做到。使用空的EventArgs参数调用所有WinForms焦点事件(GotFocus,LostFocus,Enter,Leave),这些参数不会为您提供任何其他信息。

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

答案 2 :(得分:1)

这种奇怪的标签行为的原因在于输入过程中的速度。得到一些输入非常好,我没想过禁用文本框,但实际上可以工作。但使用Enter键接受输入甚至没有超出我的想法。那会更好。用户可以输入数字,然后按Enter键接受输入,下一个可能的文本框将是活动文本框。这就像吃蛋糕一样,吃它也是速度因素,因为当使用回车键时,不必进行任何不必要的标签就可以到达正确的字段,并使用数字键盘旁边的回车键使其非常流畅。

感谢您的投入!

答案 3 :(得分:0)

我同意DannySmurf的观点。如果应用程序的要求发生变化,那么使用Tab键顺序可能会让你下台。

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

答案 4 :(得分:0)

比禁用控件更好,尝试使用TabStop进行修改 - 如果这是错误的,则在选项卡时将简单地跳过控件。

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

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