【问题标题】:Override tab behavior in WinForms覆盖 WinForms 中的选项卡行为
【发布时间】:2008-08-16 20:48:00
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        感谢您的意见!

        【讨论】:

          【解决方案4】:

          我同意 DannySmurf 的观点。如果应用程序的要求发生变化,弄乱 Tab 键顺序可能会在以后给您带来麻烦。

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2011-05-04
              • 1970-01-01
              • 1970-01-01
              • 2013-01-26
              • 1970-01-01
              • 2020-06-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多