私は以前これに気づいていなかったので驚いていました。おそらく私は何かが明らかに欠けているでしょう。 DataSource
のComboBox
をBindingList
に設定してリストからアイテムを削除すると、SelectedValueChanged
またはSelectedIndexChanged
イベントは発生しませんが、SelectedValueは変更されます。ここで再現するための完全なソースは、次のとおりです。ComboBox DataSourceが変更されたときにSelectedValueChangedが呼び出されない
public partial class Form1 : Form
{
public readonly BindingList<string> Items = new BindingList<string>();
public Form1()
{
InitializeComponent();
Items.Add("One");
Items.Add("Two");
Items.Add("Three");
comboBox1.DataSource = Items;
comboBox1.SelectedValueChanged += comboBox1_SelectedValueChanged;
comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
button1.Click += button1_Click;
timer1.Interval = 250;
timer1.Tick += timer1_Tick;
timer1.Start();
}
private string GetCurrentText()
{
return comboBox1.SelectedValue as string ?? "NULL";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
textBox1.Text += "Index Changed: " + GetCurrentText() + Environment.NewLine;
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
textBox1.Text += "Value Changed: " + GetCurrentText() + Environment.NewLine;
}
private void timer1_Tick(object sender, EventArgs e)
{
Text = GetCurrentText();
}
private void button1_Click(object sender, EventArgs e)
{
Items.Remove((string)comboBox1.SelectedValue);
}
}
すべてのフォームはComboBox
、Button
、実際のコンボボックスのSelectedValueのイベントをログに記録する複数行TextBox
を追跡するTimer
でいます。
フォームを実行するには、コンボボックスから2番目の値( "2")を選択し、ボタンを押します。いいえSelectedValueChanged
もSelectedIndexChanged
ボタンが押されたときにイベントが発生しますが、フォームのテキストにはタイマーによって与えられた新しい値( "3")が表示されます。これもコンボボックスに表示されます。したがって、実際に選択された値は、イベントが発生することなく、確実に変更されます。
残念ながら、SelectedItemChanged
イベントはありません。そのため、開発者はどのようにこの状況に対処するのか分かりません。どのような "エッジ"のケースが値を黙って変更するかわからないので、私が思いつくハックの解決策がすべてのケースをカバーしないかもしれない。誰かが真の解決策を考え出したのだろうかと思います。
すべてのイベントは完全に機能します。ボタンイベントが発生しました。私はあなたのコードをコピーして貼り付けました。 –
回避策:http://stackoverflow.com/questions/7420273/databinding-bindinglist-to-combobox-and-removing-items – WhoIsRich
@TripleK .NET 4.5以外のものを使用していましたか? – Juan