c# - 如何通过Tab键使WinForm按钮及时获得焦点

标签 c# winforms events windows-controls

Visual Studio 2010,C#

我有一个带有 DropDownComboBoxAutoComplete 设置为 SuggestAppendAutoCompleteSource 来自 ListItems。用户将数据键入其中,直到输入正确为止。在数据与列表项之一匹配之前,组合框旁边的按钮将被禁用。

如果用户点击 Tab 键,自动完成功能会接受当前建议。它还移动到启用的选项卡序列中的下一个控件。当然,因为我希望它转到禁用按钮,所以我需要在验证条目后立即启用它。

问题是我尝试过的所有事件,PreviewKeyDownLostFocusSelectedIndexChanged 都不允许我及时启用按钮以便对其进行处理并获得焦点。它总是按 Tab 键顺序转到下一个按钮,该按钮始终处于启用状态。

我正准备让按钮保持启用状态,如果按下得太快,它会给出一个错误,但我不想那样做。我也不想使用特殊模式标志来跟踪这些控件何时获得焦点。验证似乎是一件很正常的事情,但我被卡住了。

如果 SelectedIndexChanged 在用户进行匹配时起作用,这将很容易。当框被清除或找到键入的匹配项时,它不会触发。

最佳答案

您可以创建自己的 ComboBox 类来封装此行为。像这样:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.myComboBox1.TheButton = this.button1;

            this.myComboBox1.Items.AddRange( new string[] {
                "Monday",
                "Tuesday",
                "Wednesday",
                "Thursday",
                "Friday",
                "Saturday",
                "Sunday"
            } );

            button1.Enabled = false;
        }
    }

    public class MyComboBox : ComboBox
    {
        public Control TheButton { get; set; }

        public MyComboBox()
        {
        }

        bool IsValidItemSelected
        {
            get { return null != this.SelectedItem; }
        }

        protected override void OnValidated( EventArgs e )
        {
            if ( null != TheButton )
            {
                TheButton.Enabled = this.IsValidItemSelected;
                TheButton.Focus();
            }

            base.OnValidated( e );
        }

        protected override void OnTextChanged( EventArgs e )
        {
            if ( null != TheButton )
            {
                TheButton.Enabled = this.IsValidItemSelected;
            }

            base.OnTextChanged( e );
        }
    }
}

关于c# - 如何通过Tab键使WinForm按钮及时获得焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11895235/

相关文章:

.net - 滚动超过 DataGridView 的底行

c# - Windows XP 应用程序 (.NET/C#) 调整大小问题

c# - 带有版本控制的Elasticsearch更新-NEST/C#

c# - 我可以使用 set 方法代替 Json 属性吗?

c# - 将单个对象绑定(bind)到 Datagridview

javascript - 每次调整 HTML 元素大小时如何运行 JavaScript 函数?

c# - 如何将字符串呈现为 html 链接

c# - 从 C# Windows 窗体应用程序使用 Windows native 复制和移动进度条

javascript - 'event' 是 JavaScript 中的保留字吗?

jQuery CSS 更改事件