【发布时间】:2009-12-21 05:04:05
【问题描述】:
在开发 .NET Windows 窗体应用程序时,我遇到了一些僵局。问题与在控件之间切换焦点以及它如何维护表单控件的状态有关。
UI 中有三个主要控件——两个组合框和一个按钮。
- 两个组合框都以
SelectedItem = null开头。 - 两个组合框都有一组明确的可供选择的有效选项。
- 两个组合框都使用
AutoCompleteMode.SuggestAppend,AutoCompleteSource设置为AutoCompleteSource.ListItems。这意味着用户可以在组合框中输入内容并弹出建议以供选择。 - ComboBox #1 始终处于启用状态。
- 除非在 ComboBox #1 中选择了特定值,否则 ComboBox #2 将被禁用。
- 该按钮仅在以下情况下启用:
- 从始终启用的组合框中选择了一个有效值。
- 从第二个组合框中选择了一个有效值IFF 在第一个组合框中选择了一个特定值。否则,其值将被忽略。
- 在所有其他情况下,它被禁用。
问题在于键盘导航和控件焦点,以及它们如何与维护各种控件的Enabled 状态相关的逻辑一起发挥作用。
简而言之,在为组合框选择值时,按 TAB(以选择组合框)将焦点放在表单上的下一个控件(根据 TabIndex 顺序)在启用逻辑之前/禁用控件正在运行。
启用/禁用控件的逻辑发生在相关组合框的 Validating/Validated 事件中。
最终结果是控件在获得焦点后可以被禁用。
例如:
- 仅启用组合框 #1。 ComboBox #2 和 Button 被禁用。所有 ComboBox 的 SelectedItem 都设置为 null。
- 将焦点设置到 ComboBox #1。
- 键入框的有效选项的前几个字母。
- 按 TAB。
当我按 TAB 时,似乎在 SelectedItem 更改之前将焦点赋予了下一个控件。在更改 SelectedItem 之前,无法运行启用或禁用其他 UI 控件的业务逻辑。
理想情况下,我想要的是相反的方式:焦点应该在 UI 控件的 SelectedItem 更新后转移,因此更新控件状态的逻辑已经运行。
有人对我如何做这件事有任何建议吗?
【问题讨论】:
标签: c# .net-2.0 controls focus state