これは、私が遭遇した問題を再現する短いプログラムです。これは、違いが生じる場合に備えて、MS Windows 7 と .NET 4.0 でコンパイルされました。
using System;
using System.Drawing;
using System.Windows.Forms;
// Compile with "csc /target:exe /out:comboboxbug.exe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll comboboxbug.cs"
// in a Visual Studio command prompt.
static class Program
{
[STAThread]
static void Main()
{
//Create a label.
Label oLabel = new Label();
oLabel.Location = new Point (10, 10);
oLabel.Size = new Size (100, 15);
oLabel.Text = "Combo box bug:";
// Create a combo-box.
ComboBox oComboBox = new ComboBox();
oComboBox.Location = new Point (10, 50);
oComboBox.Size = new Size (150, 21);
oComboBox.Items.AddRange (new object[]
{ "A", "A B", "A C", "A B C", "A C B", "A B C D", "A C B D" });
oComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
oComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
oComboBox.SelectionChangeCommitted
+= new EventHandler (comboBox_SelectionChangeCommitted);
// Create a form.
Form oForm = new Form();
oForm.Size = new Size (200, 150);
oForm.Controls.Add (oLabel);
oForm.Controls.Add (oComboBox);
// Run this form.
Application.Run (oForm);
}
static void comboBox_SelectionChangeCommitted (object sender,
EventArgs e)
{
MessageBox.Show ("SelectionChangeCommitted");
}
}
コンボ ボックスのテキスト部分をクリックし、「A」と入力します。オートコンプリート候補のリストが表示されます。選択項目の 1 つをマウスでクリックします。イベントはSelectionChangeCommitted
発生しません!
オートコンプリートを使用せずにメニュー項目を選択します。SelectionChangeCommitted
イベントが発生したことを示すメッセージ ボックスが表示されます。
どちらの場合もユーザーによって選択が変更された場合、両方の場合でSelectionChangeCommitted
呼び出されるべきではありませんか?
この缶詰の例の背後にあるアプリケーションでは、プログラムで設定されたときではなく、ユーザーが選択を行ったときにのみイベントが発生するようにするため、イベントの使用はSelectedIndexChanged
オプションではありません。
編集 2020-Oct-28:SelectionChangeCommitted
呼び出されない別のケースを見つけました! 問題が発生するためにオートコンプリートを設定する必要さえありません! クリックしてコンボ ボックスを開き、コンボ ボックス項目の 1 つの先頭に一致するキーを押してから、Tab キーを押して終了します。コンボ ボックスの項目が選択されますが、SelectionChangeCommitted
呼び出されません! 私の修正された答えは以下です。