ComboBox Items集合是一个ObjectCollection,因此您当然可以在其中存储任何内容,但这意味着您不会像使用ListViewItem那样获得Text属性。 ComboBox通过在每个项目上调用ToString()或在设置了DisplayMember属性的情况下使用反射来显示项目。

我的组合框处于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事件最终被触发两次(一次在原始用户事件上触发,然后在我在此代码中重新设置该属性时再次触发)。在这种情况下,事件被触发两次并不是什么大不了的事,但是效率低下,我对此非常讨厌。我可以建立一个标志,以便它第二次退出该事件,但这是黑客行为。

有没有更好的方法来使它起作用?

最佳答案

肮脏的骇客:

typeof(ComboBox).InvokeMember("RefreshItems", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, cboPlants, new object[] { });

10-06 02:49