2008-08-16 60 views
5

我有一个由三个文本框组成的用户控件。在窗体上,我可以有一个或多个或我的UserControl。我想实现我自己的选项卡行为,所以如果用户在第二个TextBox中按下Tab,我应该只在第二个TextBox输入任何内容时才移动到第三个TextBox。如果在第二个TextBox中没有输入任何内容,则表单的下一个控件应该按照常规选项卡行为获得焦点。如果用户没有在第一个或第二个文本框和印刷机标签页中输入任何内容,则会出现这种特殊情况,即表单上的控件应该被跳过。覆盖WinForms中的选项卡行为

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

回答

3

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

现在,在说了这些之后,我也根据客户的要求打破了这条规则。我们制作了输入键功能,如Tab键,其中Enter键将值保存在文本字段中,并将光标前移到下一个字段。

1

我不认为有一种内置的方式,你可以做到这一点。使用空的EventArgs参数调用所有的WinForms焦点事件(GotFocus,LostFocus,Enter,Leave),这些参数不会提供任何其他信息。正如Rob Thomas所说,我个人会禁用第三个文本框。但是,如果您决定这样做,那么设置手册(读取:hackish)的解决方案并不困难。一旦按Tab键(如果焦点在第二个文本框上),请在表单中设置一个变量。如果下一个对象是第三个文本框,那么你确切知道它是如何发生的。

0

我同意DannySmurf。如果应用程序的要求发生变化,那么随着Tab键的顺序进行调整可能会让你后悔。

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

1

这种奇怪的选项卡行为的原因都是关于输入过程中的速度。得到一些输入真的很好,我没有想过禁用文本框,但实际上可以工作。但使用Enter键接受输入甚至没有超出我的想法。这会工作得更好。用户可以输入数字,然后按回车键接受输入,下一个可能的文本框将成为活动的文本框。这就像吃蛋糕,吃东西一样,速度因素在那里,因为当使用回车键时,不必进行不必要的制表,以达到正确的字段,并使用数字键盘旁边的回车键使其真正平滑。

感谢您的意见!

0

比禁用控件更好,试着用TabStop瞎搞 - 如果这是错误的,控件将在选项卡时跳过。

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

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