5

Visual Studio 2010、C#

ComboBoxに設定されており、DropDownはからのものです。ユーザーは、正しいエントリが得られるまでデータをキー入力します。データがリスト項目の 1 つと一致するまで、コンボボックスの横のボタンは無効になります。AutoCompleteSuggestAppendAutoCompleteSourceListItems

ユーザーがタブ キーを押すと、オートコンプリート機能は現在の提案を受け入れます。また、有効になっているタブ シーケンス内の次のコントロールに移動します。もちろん、無効なボタンに移動したいので、エントリを検証したらすぐに有効にする必要があります。

問題は、私が試したイベントのどれも、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

ここで他の答えを考えて、 AutoCompleteを使用せずに機能する部分的なシナリオを思いつきました。副作用として、PreviewKeyDown イベントが 2 回呼び出されるため、検証が 2 回呼び出されます。なぜだろう…別の質問をする必要があるかもしれません。

    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以外の設定でオンにすると、キーが静かに食べられるためNoneKeyDownイベントは発生しなくなります。Tab

于 2012-08-10T14:22:20.353 に答える
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) の代わりに、コンボボックスの「検証済み」イベントを使用して、ボタンの有効状態を設定します。

ただし、フォーカスを強制的にボタンに移動するには、ボタンに手動でフォーカスする必要がある場合もあります。

例えば

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