私はComboBox
いくつかのアイテムを持っています。イベントにイベントハンドラーを追加しましたSelectedIndexChanged
。リストにAとBの2つのアイテムがあるとします。現在選択されているアイテムがAで、ユーザーがそれをBに変更した場合、イベントが発生し、それで問題ありません。ただし、ユーザーがをクリックしてComboBox
もう一度Aをクリックした場合(つまり、アイテムが実際に変更されていない場合)、イベントは引き続き発生します。アイテムが確実に変更された場合、またはこれを達成できる何かがあった場合にのみ、イベントが発生するようにしたいと思います。
7 に答える
ComboBox
変更選択を図式的に計画していない場合は、 を使用してみてくださいSelectionChangeComitted
。
このロジックをComboBox(私の例ではComboBoxEx)から派生したクラスにカプセル化することをお勧めします
private class ComboBoxEx : System.Windows.Forms.ComboBox
{
Int32 _lastIndex = -1;
protected override void OnSelectedIndexChanged(System.EventArgs e)
{
if (_lastIndex == -1)
{
_lastIndex = this.SelectedIndex;
base.OnSelectedIndexChanged(e);
}
else
if (_lastIndex != this.SelectedIndex)
{
base.OnSelectedIndexChanged(e);
_lastIndex = this.SelectedIndex;
}
}
}
そして、次のように使用します。
public Form1()
{
var combobox = new ComboBoxEx() { DropDownStyle = ComboBoxStyle.DropDownList };
combobox.Items.Add("Item 1");
combobox.Items.Add("Item 2");
combobox.Items.Add("Item 3");
this.Controls.Add(combobox);
combobox.SelectedIndexChanged += OnIndexChanged;
InitializeComponent();
}
private void OnIndexChanged(object sender, EventArgs e)
{
MessageBox.Show("Index changed");
}
これがあなたの言いたいことだと思います:
int intIndex; //Global Variable
//In your ComboBox_SelectedIndex Changed event
if(myComboBox.SelectedIndex != intIndex)
{
//your code
intIndex = myComboBox.SelectedIndex;
}
SelectedIndexChanged の代わりに TextChanged イベントにイベント ハンドラーを追加するだけで問題が解決しました。これは、ComboBox (ドロップダウン リスト) 内の 2 つの項目が同じテキストを持たないことを確認できるため、私の場合はうまくいきます。
1 つの解決策は、コンボボックスをモデル クラスのプロパティにデータバインドすることです。次に、モデルはインターフェイス INotifyPropertyChanged を実装する必要があります (値が変更された場合にのみ、正しく起動します)。次に、PropertyChanged イベントを使用して、コントロールの選択の変更を処理できます。このイベントは、実際の変更が発生した場合にのみ発生します。
ComboBox の SelectedIndex を使用して int 変数を定義すると、変数がインデックスと同じ値を持っているかどうかを確認できます。はいの場合は何もしないでください。
int lastIndex = myComboBox.SelectedIndex;
次に、SelectedIndexChangedEvent で:
if(lastIndex != myComboBox.SelectedIndex){
//do something
}
InitializeComponent()で、これをコンボボックスに入れます
private void InitializeComponent()
{
///combobox
///This line will triger if the combobox has changed
this.combobox.SelectedIndexChanged += System.EventHandler(this.comboboxChanged);
}
次に、メインメソッドで次のようなコンボボックスメソッドを作成します
private string previousValue;
Private void comboboxChanged(object sender, EventArgs e)
{
if (combobox.Text == "A" && previousValue == "A")
{
//Do nothing
previousValue = "A";
}
else if (combobox.Text == "B" && previousValue == "B")
{
//Do Nothing
previousValue = "B";
}
else if (combobox.Text == "A")
{
//Do Something
previousValue = "A";
}
else if (combobox.Text == "B")
{
//Do Something
previousValue = "B";
}
}