不会引发ComboBox.SelectedIndexChanged

时间:2014-10-27 15:33:12

标签: c# winforms data-binding

我有一个只包含空ComboBox的表单。 我将DataSource设置为空的BindingList。 当我向BindingList添加一些内容时,它被选中并且combobox1.SelectedIndex发生了变化,但事件comboBox1_SelectedIndexChanged并没有被提升,甚至在我看来应该很难。为什么不提出?删除单个项目时,将正确触发comboBox1_SelectedIndexChanged。

public partial class Form1 : Form
{
    public Form1()
    {
        var test_ = new BindingList<int>();
        InitializeComponent();
        comboBox1.DataSource = test_;
        Console.WriteLine(comboBox1.SelectedIndex); // -1
        test_.Add(42); // BUG? no comboBox1_SelectedIndexChanged -> 0
        Console.WriteLine(comboBox1.SelectedIndex); // 0
        test_.Remove(42); // comboBox1_SelectedIndexChanged -> -1
        Console.WriteLine(comboBox1.SelectedIndex); // -1
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Console.WriteLine("index changed " + comboBox1.SelectedIndex);
    }
}

2 个答案:

答案 0 :(得分:0)

你的逻辑不正确。

comboBox1.SelectedIndex -1并不意味着您在item位置选择了-1
这意味着comboBox1中没有选择任何项目。

添加项目后,SelectedIndex变为0。选择上没有更改,因为首先选择了没有商品 (SelectedIndex = -1)

答案 1 :(得分:0)

解决这个问题的一种方法是使用您正在使用的BindingList集合的ListChanged事件:

var test_ = new BindingList<int>();
comboBox1.DataSource = test_;
test_.ListChanged += (sender, e) => {
  if (e.ListChangedType == ListChangedType.ItemAdded && test_.Count == 1) {
    comboBox1_SelectedIndexChanged(comboBox1, EventArgs.Empty);
  }
};
test_.Add(42);