5

视觉工作室 2010,C#

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

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

问题是我尝试过的所有事件PreviewKeyDown,LostFocusSelectedIndexChanged不允许我及时启用按钮以使其被处理并获得焦点。它总是按选项卡顺序转到下一个按钮,该按钮始终处于启用状态。

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

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

4

4 回答 4

1

您可以创建自己的 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 );
        }
    }
}
于 2012-08-10T04:29:04.453 回答
0
try this :

key_press 事件:

if (e.KeyData == Keys.Enter)
        {
            button2.Enabled = true;
            button2.Focus();
        }
于 2012-08-10T04:13:19.747 回答
0

而不是您提到的事件处理程序,(LostFocus、SelectedIndexChanged 和 PreviewKeyDown)使用组合框的“Validated”事件来设置按钮的启用状态。

您可能还需要手动关注按钮以强制焦点移动到它。

例如

    private void comboBox1_Validated(object sender, EventArgs e)
    {
        button1.Enabled = true;
        button1.Focus();
    }
于 2012-08-10T04:13:31.047 回答
0

考虑到这里的其他答案,我想出了一个不使用AutoComplete就可以工作的部分场景。副作用是 PreviewKeyDown 事件被第二次调用,因此验证被调用了两次。我想知道为什么......也许我应该问另一个问题。

    private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
      if (e.KeyData == Keys.Tab) {
        if (ValidationRoutine()) {
          e.IsInputKey = true;  //If Validated, signals KeyDown to examine this key
        } //Side effect - This event is called twice when IsInputKey is set to true
      }          
    }

    private void comboBox1_KeyDown(object sender, KeyEventArgs e) {
      if (e.KeyData == Keys.Tab) {
          e.SuppressKeyPress = true; //Stops further processing of the TAB key
          btnEdit.Enabled = true;
          btnEdit.Focus();
      }
    }

AutoCompleteMode一旦您使用除 以外的任何设置打开None,该KeyDown事件就不会再触发,Tab因为密钥会被静默吃掉。

于 2012-08-10T14:22:20.353 回答