[英]TListView: Subitem order after adding a new column between existing during runtime
如果在運行時期間在現有列之間添加新列,則子項索引不會像我假設的那樣。
例如,在第二列和第三列之間添加新列后,列/子項如下所示:
colums[0] | colums[1] | (new) columns[2] | columns[3]
caption | subitems[0] | subitems[2] | subitems[1]
但我會假設:
colums[0] | colums[1] | (new) columns[2] | columns[3]
caption | subitems[0] | subitems[1] | subitem[2]
我需要能夠在某些條件下動態更新子項的內容。 這就是為什么我想依賴於這樣的假設,即Column.Index = X的列的子項位於Item.SubItems [X-1]。
你認為這是默認和指定的行為嗎? 如果是這樣,你會建議根據列更新子項。 可能是保存屬於最近添加的列的子項索引。
注意 :Columns.Tag屬性已在使用中。
我正在使用Delphi XE和XE2,但我需要與Delphi 7及更高版本兼容。
您不需要保存索引位置,您可以隨時詢問列表視圖控件本身列的原始位置:
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
數組將保持( ColumnOrder
)。 如果我們想要更新新插入列的子項(左起第3列),則其原始位置為“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;
請注意,如果您要添加列而不僅僅是重新排序現有列,這只有在您修復了另一個問題中的錯誤時才會起作用(如果不這樣做,則再次執行,同時提供列重新排序和列無論如何都不可能添加功能)。
關於默認行為是否應該如此,假設您有一個列表視圖,您正在顯示具有列'name','size','date'的文件信息。 作為開發人員,您不應該擔心用戶可能放置“大小”列的位置,只需將信息放入“SubItems [0]”即可。 此外,如果用戶拖動“名稱”列,它將從項目降級為子項目。
我認為期望項目/子項目遵循各自的列是合乎邏輯的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.