我试图在添加/编辑条目后对 TListBox 控件中的项目进行排序。
我看到有一个 Sorted 属性我已设置为true,但是,每次我更改为 ListBox 时,都不会动态对其进行排序内容。似乎没有任何 Sort 过程或功能可用,并且调用 Update 或 Refresh 没有达到预期的效果。
我已经到了这个阶段,我正在考虑将 ListBox 的内容拉入 TStringList 对象,对其进行排序,然后将所有内容放回 ListBox 再次。这看起来有点疯狂,当然我忽略了一些更好的方法。
以下是更改现有项目的示例:
myListBox.Items[myIndex] := newString; // Update Text
myListBox.Items.Objects[myIndex] := TObject(my_object); // Update associated object
我希望控件能够更新以按字母顺序排序,但事实并非如此。
答案 0 :(得分:5)
列表框的排序属性实际上由Win32列表框样式LBS_SORT
支持。这将在添加新项目时对列表框进行排序。但是,当修改现有项目时,它不会这样做。
因此,解决此问题的简单方法是将Sorted
设置为True
,然后删除旧值并添加新值,而不是修改现有值。所以你的代码将成为:
myListBox.Items.Delete(myIndex);
myListBox.Items.AddObject(newString, TObject(my_object));
如果您考虑一下,如果列表框的行为符合您的预期,您的代码将注定要失败。因为在您修改了项目的文本后,如果列表被重新排序,那么myIndex
将不再引用相同的项目。