ComboBox的Items集合是一个ObjectCollection,所以你可以在里面存储任何你想要的东西,但这意味着你不会像ListViewItem那样拥有Text属性。ComboBox通过调用每个项的ToString()方法来显示项,或者如果设置了DisplayMember属性,则使用反射。
我的ComboBox处于DropDownList模式。我遇到了这样一种情况:当用户选择某个项目时,我希望刷新列表中单个项目的文本。问题是,除了加载时之外,ComboBox不会在任何其他时间重新查询文本,而且我无法找出如何实现我想要的效果,除非像这样删除并重新添加所选项目:
我的ComboBox处于DropDownList模式。我遇到了这样一种情况:当用户选择某个项目时,我希望刷新列表中单个项目的文本。问题是,除了加载时之外,ComboBox不会在任何其他时间重新查询文本,而且我无法找出如何实现我想要的效果,除非像这样删除并重新添加所选项目:
PlantComboBoxItem selectedItem = cboPlants.SelectedItem as PlantComboBoxItem;
// ...
cboPlants.BeginUpdate();
int selectedIndex = cboPlants.SelectedIndex;
cboPlants.Items.RemoveAt(selectedIndex);
cboPlants.Items.Insert(selectedIndex, selectedItem);
cboPlants.SelectedIndex = selectedIndex;
cboPlants.EndUpdate();
这段代码运行良好,除了一个问题,就是我的SelectedIndex事件会被触发两次(一次是在原始用户事件中,另一次是在我重新设置属性时)。在这种情况下,事件触发两次并不是什么大问题,但它是低效的,我很讨厌这样。我可以设置一个标志来在第二次退出事件,但那是hack的。
有没有更好的方法使它正常工作?
ResetItem()
吗?如果你直接更新cboPlants
中的项目,它应该会被更改(我想是这样的吧?)。你可以在SelectedIndexChanged
事件中通过_plantList[selectedIndex]
访问它。 - Donut