【问题标题】:Can I remove items from a ComboBox without changing the index of other items?我可以从 ComboBox 中删除项目而不更改其他项目的索引吗?
【发布时间】: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 表示第一个位置的项目。

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

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

【问题讨论】:

    标签: c++ user-interface mfc


    【解决方案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);
        猜你喜欢
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 2022-10-25
        • 1970-01-01
        • 2020-11-09
        • 2022-11-17
        相关资源
        最近更新 更多