我可以从 ComboBox 中删除项目而不更改其他项目的索引吗?

Posted

技术标签:

【中文标题】我可以从 ComboBox 中删除项目而不更改其他项目的索引吗?【英文标题】:Can I remove items from a ComboBox without changing the index of other items? 【发布时间】:2010-10-14 20:27:38 【问题描述】:

我有一个带有多个项目的CComboBox 控件,我需要删除其中一些,但应保留剩余项目的索引。

当组合框被填充时,item 数据是这样设置的:

index = mycombo.AddString(temp);
mycombo.SetItemData(index, static_cast<DWORD>(count));

其中count 是一个循环计数器,应该等于index

现在我想稍后删除一些项目,但我需要每个剩余项目的索引保持不变。 CComboBox::DeleteString(UINT nIndex) 我应该使用什么?它的文档说:

nIndex 之后的所有项目现在下移一位。例如,如果一个组合框包含两个项目,删除第一个项目将导致其余项目现在位于第一个位置。 nIndex=0 表示第一个位置的项目。

是说下拉菜单中的物理位置,还是与项目关联的索引值?

还有其他功能可以满足我的需求吗?完全是另一种解决方案?

【问题讨论】:

【参考方案1】:

这是在谈论下拉菜单中的物理位置,还是与项目关联的索引值?

对于 ComboBox(以及 ListBox、List Control 和可能的许多其他类似的东西),控件上项目的位置直接与其索引相关联。索引位置。真的,只要把它想象成 ComboBox 是在内部使用一个简单的 std::vector 实现的。你不能在不影响所有后续条目的索引的情况下从向量中删除条目,这些控件也是如此。

但是,ComboBox(和其他此类控件)中条目的项目数据与该条目保持一致,无论它被重新分配到什么索引。

假设您创建了两个条目:索引 0 处的第一个具有 text="A" 和 ItemData=0;而索引 1 处的第二个具有 text="B" 和 ItemData=1。如果您随后删除第一个条目,则第二个条目将下移声明索引,并且其 ItemData 将随之移动。因此,您将在索引 0 处留下一个具有 text="B" 和 ItemData=1 的条目。

【讨论】:

【参考方案2】:

在组合框中,您可以看到具有相关联的字符串和整数值的项目。通常,您只会看到字符串。这些项目由索引引用,该索引仅表示列表中每个项目的位置。如果您删除一个项目,它下面的所有项目都会“重新定位”,因此索引会更改。在两个项目之间的任何位置或开头插入元素时也会发生同样的情况。

索引总是从 0 到 (number_of_items-1),您对此无能为力。

也就是说,项目数据始终与项目保持一致,这就是您在查找特定项目时应该查看的内容。不是它的索引,也不是它的字符串。查看项目数据。如果您添加、删除或重新使用这些项目,则索引可能会更改。如果您对软件进行本地化,字符串将会改变。因此,使用数据来正确识别每个元素。

您可以查看http://www.flounder.com/combobox.htm,在那里您可以找到更好的解释,其中包含一些示例和代码,可以更轻松地使用组合框。

【讨论】:

【参考方案3】:

添加或删除项目不会更改您传递给 SetItemData() 的数字。 GetItemData() 返回相同的数字。但是,您需要将项目的索引传递给 DeleteString()。如果之前删除了编号较低的项目,则索引将不再匹配 GetItemData()。如果您丢失了要删除的特定项目的索引,则需要迭代这些项目以将其找回。

【讨论】:

我不确定我是否遵循,因为您的第四句话似乎与前两句话相矛盾。你是说传递给SetItemData的第二个参数在同一个元素上依然会被GetItemData返回,但是传递给GetItemData的参数会不一样? 是的,这就是我要说的。如果删除项目索引 0,则第二个项目的索引变为 0。GetItemData(0) 返回 1。 通过迭代项目他的意思是for (int i=0; i&lt;cmb.GetCount(); i++) if (cmb.GetItemData(i) == myvar) cmb.DeleteString(i);

以上是关于我可以从 ComboBox 中删除项目而不更改其他项目的索引吗?的主要内容,如果未能解决你的问题,请参考以下文章

用于ComboBox项目选择的事件处理程序(选定项目未必更改)

读取 SQL 表单元格值,仅更改 ComboBox.text 而不更改 ComboBox 集合项

DataSource 更改时,ComboBox 不会自动更新?

从列表中删除数字而不更改总和

当 DataSource 值更改时,WinForms ComboBox 中的项目不会更新

更改 ComboBox 文本但未选择项