覆盖WinForms中的选项卡行为
我有一个由三个TextBox组成的UserControl。在表单上,我可以拥有一个或者多个或者我的UserControl。我想实现自己的选项卡行为,因此,如果用户在第二个TextBox中按下Tab键,则仅当第二个TextBox输入了任何内容时,才应移至第三个TextBox。如果在第二个TextBox中未输入任何内容,则窗体的下一个控件应按照正常的选项卡行为获得焦点。如果用户没有在第一个或者第二个TextBox中输入任何内容,而在presss选项卡上,则在这种特殊情况下应跳过表单上的控件。
通过使用ProcessDialogKey,我设法使其正常运行,但仍然有一个问题。我的问题是,是否有一种方法可以检测WinForms控件如何获得焦点,因为我还想知道我的UserControl是否从Tab或者Shift-Tab中获得焦点,然后执行奇怪的操作,但是如果用户单击该控件,不想做任何特别的事情。
解决方案
回答
通常,我想说重写TAB密钥的标准行为是一个坏主意。也许我们可以执行一些操作,例如禁用第3个文本框,直到在第2个文本框中输入有效的条目。
现在,这样说来,我还应客户的要求打破了这一规则。我们使Enter键功能像Tab键一样,其中Enter键会将值保存在文本字段中,然后将光标移至下一个字段。
回答
我认为我们没有内置的方法可以做到这一点。使用空的EventArgs参数调用所有WinForms焦点事件(GotFocus,LostFocus,Enter,Leave),该参数不会提供任何其他信息。
就个人而言,正如罗伯·托马斯(Rob Thomas)所说,我将禁用第三个文本框。但是,如果我们确定要这样做,则设置手动(阅读:hackish)解决方案并不难。按下Tab键后(如果焦点位于第二个文本框上),请在表单内设置一个变量。如果下一个关注的对象是第三个文本框,则我们确切地知道它是如何发生的。
回答
我同意DannySmurf的观点。如果应用程序的需求发生变化,那么按Tab键排序可能会给我们带来麻烦。
我们可以做的另一件事是为用户实现某种向导。
回答
这种奇怪的制表符行为的原因全都与输入过程中的速度有关。得到一些输入真的很好,我没想过禁用文本框,但实际上可以工作。但是,使用Enter键接受输入的想法甚至还没有引起我的注意。那会好得多。用户可以输入数字,然后按Enter接受输入,下一个可能的文本框将是活动的。这就像吃蛋糕和吃蛋糕一样,速度因数是存在的,因为使用回车键时无需进行任何不必要的制表操作即可到达正确的字段,并且使用数字键盘旁边的回车键可使其真正顺畅。
感谢输入!
回答
比禁用控件更好,如果此选项为false,请尝试使用TabStop进行浏览,在使用Tab键时,将仅跳过该控件。
我还建议TextBox的Changed事件是在其他控件上更新TabStop的地方。
我已经使用登录控件完成了类似的操作,用户可以在其中输入用户名或者电子邮件地址(在单独的字段中)以及他们的密码,而tabStop是我用来完成工作的方式。