2016-06-20 28 views
2

私は以前これに気づいていなかったので驚いていました。おそらく私は何かが明らかに欠けているでしょう。 DataSourceComboBoxBindingListに設定してリストからアイテムを削除すると、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); 
    } 
} 

すべてのフォームはComboBoxButton、実際のコンボボックスのSelectedValueのイベントをログに記録する複数行TextBoxを追跡するTimerでいます。

フォームを実行するには、コンボボックスから2番目の値( "2")を選択し、ボタンを押します。いいえSelectedValueChangedSelectedIndexChangedボタンが押されたときにイベントが発生しますが、フォームのテキストにはタイマーによって与えられた新しい値( "3")が表示されます。これもコンボボックスに表示されます。したがって、実際に選択された値は、イベントが発生することなく、確実に変更されます。

残念ながら、SelectedItemChangedイベントはありません。そのため、開発者はどのようにこの状況に対処するのか分かりません。どのような "エッジ"のケースが値を黙って変更するかわからないので、私が思いつくハックの解決策がすべてのケースをカバーしないかもしれない。誰かが真の解決策を考え出したのだろうかと思います。

+0

すべてのイベントは完全に機能します。ボタンイベントが発生しました。私はあなたのコードをコピーして貼り付けました。 –

+1

回避策:http://stackoverflow.com/questions/7420273/databinding-bindinglist-to-combobox-and-removing-items – WhoIsRich

+0

@TripleK .NET 4.5以外のものを使用していましたか? – Juan

答えて

0

これは論理的に真です。 'Two'を選択した後、comboBox1.SelectedIndex = 1。次に、「2つの」アイテムを削除しました。したがって '3'は '2'からインデックス '1'にな​​り、コンボボックスではインデックスは変更されません。コンボのイベントは発生しません。

もう一度ボタンをクリックすると、コンボのイベントが発生します。

+0

はい、SelectedValueChangedイベントはどうですか? – Juan

関連する問題