您不需要保存索引位置,您可以随时询问列表视图控件本身列的原始位置:
procedure TForm1.Button1Click(Sender: TObject);
var
ColumnOrder: array of Integer;
begin
SetLength(ColumnOrder, ListView1.Columns.Count);
ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count,
PInteger(ColumnOrder));
对于问题中的示例,ColumnOrder
数组将包含 (0, 1, 3, 2)。如果我们要更新新插入的列(左起第三列)的子项,那么它的原始位置是'3'。代码示例:
var
ColumnOrder: array of Integer;
SubIndex: Integer;
begin
SetLength(ColumnOrder, ListView1.Columns.Count);
ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count,
PInteger(ColumnOrder));
SubIndex := ColumnOrder[2]; // We want to update 3rd column from left
// (visually -> SubItems[1])
// Test if the index is not 0, otherwise it holds an *item*,
// not a subitem (the first column can change position too).
if SubIndex > 0 then begin
Dec(SubIndex); // VCL subitems are 0 based
ListView1.Items[1].SubItems[SubIndex] := 'updated!';
end;
请注意,如果您要添加列而不仅仅是重新排序现有列,则只有在您修复了另一个问题中的错误时,这才有效(如果没有,则再次提供列重新排序和列无论如何添加功能是不可能的)。
关于默认行为是否应如此,假设您有一个列表视图,您正在显示包含“名称”、“大小”、“日期”列的文件信息。作为开发人员,您不应该担心用户可能将“大小”列放在哪里,只需将信息放在“子项 [0]”中即可。此外,如果用户拖动“名称”列,它会从一个项目降级为一个子项目。
我认为期望项目/子项目将遵循它们各自的列是合乎逻辑的。