编程选择索引0时,Combobox不会触发SelectedIndexChanged(从-1开始)

时间:2016-07-18 10:33:47

标签: c# .net combobox .net-4.0

我有一个组合框,因为我使用SelectIndexChanged事件捕获用户和程序更改。

清除并重新加载绑定到组合框的列表将自然地以索引-1触发事件处理程序。

然后使用selectedindex = -1

combobox1.SelectedIndex = 0 ; // will NOT fire the event.

combobox1.SelectedIndex = 1 ; // or higher number WILL fire the event.

在这两种情况下,我都是以编程方式更改selextedindex并期望触发事件。

我以简单的形式验证了这种行为。

namespace cmbTest
{
    public partial class Form1 : Form
    {
        private BindingList<string> items = new BindingList<string>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = items;
            loadItems();
        }

        private void loadItems()
        {
            items.Add("chair");
            items.Add("table");
            items.Add("coffemug");
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MessageBox.Show("Fired with selected item index:" + comboBox1.SelectedIndex);
        }

        private void button1_Click(object sender, EventArgs e)
        {

            int index = comboBox1.SelectedIndex;

            // Clear and reload items for whatever reason.
            items.Clear();
            loadItems();

            // try select old item index; if it doesnt exists, leave it.
            try { comboBox1.SelectedIndex = index; }
            catch { }
        }





    }
}

表单有一个combobox1和一个button1。

为了清晰而编辑(我希望):

  1. 运行程序
  2. 选择&#39;主席&#39;。消息&#34;与所选项目索引一起使用:0&#34;
  3. 点击按钮。消息&#34;与所选项目索引一起使用:-1&#34;
  4. 选择&#39;表&#39;。消息&#34;与所选项目索引一起使用:1&#34;
  5. 点击按钮。消息&#34;与所选项目索引一起触发:-1&#34;和 &#34;被选中的项目索引:1&#34;。
  6. 我希望在按下按钮时收到两条消息&#34; chair&#34;也被选中,因为我以编程方式将索引更改为0.

    那么,为什么这不能像我期望的那样工作,什么是可接受的解决方法呢?

1 个答案:

答案 0 :(得分:3)

当您的第一个项目添加到items集合时,索引会自动更改为0.这就是为什么当您的上一个索引保存为0,然后使用此行comboBox1.SelectedIndex = index;再次设置它时,索引是没有改变。这就是事件没有被解雇的原因。

查看ComboBox的源代码,在两种情况下不会触发事件:抛出expcetion,或者将索引设置为与它相同的值。

如果你真的想要解决这个问题,你可以这样做:

int index = comboBox1.SelectedIndex;

// Clear and reload items for whatever reason.
items.Clear();
loadItems();

if(comboBox1.SelectedIndex == index)
{
    comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged;
    comboBox1.SelectedIndex = -1;
    comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
}

// try select old item index; if it doesnt exists, leave it.
try { comboBox1.SelectedIndex = index; }
catch
{
}