我有一个CComboBox
控件包含多个项目,我需要删除其中的一些项目,但应保留其余项目的索引。
填充组合框时,项目数据的设置如下:
index = mycombo.AddString(temp);
mycombo.SetItemData(index, static_cast<DWORD>(count));
其中count
是一个循环计数器,应该等于index
现在我想稍后删除一些项目,但我需要保留每个剩余项目的索引。 CComboBox::DeleteString(UINT nIndex)
我应该使用什么?它的文件说:
nIndex之后的所有项目现在向下移动一个位置。例如,如果组合框包含两个项目,则删除第一个项目将导致剩余项目现在位于第一个位置。 nIndex = 0表示第一个位置的项目。
这是在谈论下拉菜单中的物理位置,还是与项目相关的索引值?
还有其他功能可以满足我的需求吗?另一个解决方案呢?
答案 0 :(得分:2)
这是在谈论下拉菜单中的物理位置,还是与项目相关的索引值?
对于ComboBox(以及ListBox,List Control以及可能还有许多其他类似的东西),控件上项目的位置直接与其索引相关联。索引是的位置。真的,只要想到它就像使用简单的std :: vector在内部实现ComboBox一样。您不能在不影响所有后续条目的索引的情况下从向量中删除条目,这与这些控件的结构相同。
但是,ComboBox中的条目的项目数据(以及其他此类控件)无论重新分配给哪个索引都会粘贴该条目。
假设您创建了两个条目:索引0处的第一个条目具有text =“A”且ItemData = 0;而索引1处的第二个具有text =“B”且ItemData = 1。如果您随后删除了第一个条目,则第二个条目将向下移动索引及其ItemData将继续传递。因此,您将在索引0处留下一个条目,其中text =“B”且ItemData = 1。
答案 1 :(得分:2)
在组合框中,您有包含字符串和相关整数值的项目。通常,您只看到字符串。这些项由索引引用,索引仅表示列表中每个项的位置。如果删除项目,则其下面的所有项目都将“重新定位”,因此索引会更改。在两个项目之间或开头处插入元素时也会发生同样的情况。
索引总是从0到(number_of_items-1),你无能为力。
也就是说,商品数据始终与商品保持一致,这就是您在查找特定商品时应该注意的内容。不是它的索引,也不是它的字符串。查看项目数据。如果添加,删除或使用项目,索引可能会更改。如果您本地化软件,字符串将更改。因此,使用数据来正确识别每个元素。
您可以查看http://www.flounder.com/combobox.htm,在那里您可以找到更好的解释,并提供一些示例和代码,以便更轻松地使用组合框。
答案 2 :(得分:1)
添加或删除项不会更改传递给SetItemData()的数字。 GetItemData()返回相同的数字。但是,您需要将项的索引传递给DeleteString()。如果在此之前删除了编号较小的项目,则索引将不再与GetItemData()匹配。如果您忘记了要删除的特定项目的索引,那么您需要迭代这些项目才能找回它。