ComboBox.SelectedIndex的使用问题

最近有个窗体要用ComboBox控件,发现在捕获SelectedIndexChanged事件时总是有一些问题。趁周末测试了一下,现总结如下:


1、任何时候,SelectedIndex变化都触发SelectedIndexChanged事件。


2.1、重新生成列表(先清空再添加)时:ComboBox显示空,但SelectedIndex保持不变。


2.2、重新绑定列表(ResetBinding)时:ComboBox会努力保持SelectedIndex不变;当SelectedIndex小于等于新列表的最大下标时,CombBox会显示新列表相应位置的项;但当SelectedIndex大于列表的最大下标时,ComboBox会先将SelectedIndex置为新列表的最大下标,然后再重新绑定列表,ComboBox显示新列表中新SelectedIndex处的值。但千万不要以在这种情况下,SelectedIndexChanged中就能获得与界面一致的值,因为ComboBox在绑定新列表之前重置SelectedIndex的值,因此,你在SelectedIndexChanged中获得的只是旧列表的值。


3、在初次将列表绑定到数据源时:ComboBox会显示列表中第一个选项,但SelectedIndex仍然是-1。


由于SelectedIndex的以上特性,若ComboBox使用绑定列表并且列表会变化,则在使用SelectedIndexChanged事件实时将ComboBox的显示项映射到内部数据时,必须加以小心。否则将极有可能内部数据与界面显示数据不一致。
我还尝试过使用SelectedValueChanged事件来代替SelectedIndexChanged事件,但是发现SelectedValueChanged事件与SelectedIndexChanged的唯一区别在于:当使用ComboBox列表绑定,用户尚未进行过选择操作时,SelectedValueChanged会在ComboBox的显示值变化时被触发。只要用户执行过选择操作,该事件就再也不会被触发。猜测SelectedValueChanged应该只在SelectedIndex为-1的时候才有可能被触发。
最终,我还是只好老老实实的用SelectedIndexChanged。为避免出现问题,建议:若要对ComboBox的列表使用绑定,则在初次绑定和重新绑定后,重置SelectedIndex为-1,然后将其置为一个默认值,或尝试将SelectedItem置为旧列表中的选中项。测试证明SelectedItem设置成功时并且该项在新旧列表中位置不同时,SelectedIndexChanged会被触发。


注:2.1,2.2均指列表改变时的特征,2.2为使用数据绑定列表时的情况。

你可能感兴趣的:(ComboBox.SelectedIndex的使用问题)