我想在TListView中的現有列之間添加一列。因此,我在最後添加新列,並通過將其索引設置爲指定值來移動它。這會起作用,直到添加另一個新列。TListView:VCL失去了列的順序,如果你添加一列
我所做的: 添加最後一個位置的列(Columns.Add),並在最後一個位置(Subitems.Add)添加子項目。之後,我通過將列索引設置到正確的位置來移動列。 這工作正常,只要它只是一列被添加。當添加第二個新列時,子項目會被搞砸。第一列的新子項移到最後位置,例如,像這樣:
0 | 1 | new A | new B | 3
Caption | old sub 1 | old sub 3 | new Sub B | new sub A
如果有人能幫忙,我會很高興!
例如,是否有可能發送到ListView的命令或消息,以便刷新或保存它的Column - > Subitem映射,我可以在添加第一個新列和它的子項後使用,以便我可以處理第二個新列與第一個列相同。
或者這只是TListViews列的錯誤 - >子項目處理或TListColumns ...?對於VCL窗體應用程序
示例代碼(指定Form1.OnCreate事件):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
listview: TListView;
initButton: TButton;
addColumn: TButton;
editColumn: TEdit;
subItemCount: Integer;
procedure OnInitClick(Sender: TObject);
procedure OnAddClick(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
listview := TListView.Create(self);
with listview do
begin
Left := 8;
Top := 8;
Width := self.Width - 30;
Height := self.Height - 100;
Anchors := [akLeft, akTop, akRight, akBottom];
TabOrder := 0;
ViewStyle := vsReport;
Parent := self;
end;
initButton := TButton.Create(self);
with initButton do
begin
left := 8;
top := listview.Top + listview.Height + 20;
Width := 75;
Height := 25;
TabOrder := 1;
Caption := 'init';
OnClick := OnInitClick;
Parent := self;
end;
editColumn := TEdit.Create(self);
with editColumn do
begin
left := initButton.Left + initButton.Width + 30;
top := listview.Top + listview.Height + 20;
Width := 120;
Height := 25;
TabOrder := 2;
Parent := self;
Caption := '';
end;
addColumn := TButton.Create(self);
with addColumn do
begin
left := editColumn.Left + editColumn.Width + 10;
top := listview.Top + listview.Height + 20;
Width := 75;
Height := 25;
TabOrder := 1;
Enabled := true;
Caption := 'add';
OnClick := OnAddClick;
Parent := self;
end;
end;
procedure TForm1.OnInitClick(Sender: TObject);
var col: TListColumn;
i, j: integer;
item: TListItem;
begin
listview.Items.Clear;
listview.Columns.Clear;
// add items
for I := 0 to 2 do
begin
col := ListView.Columns.Add;
col.Caption := 'column ' + IntToStr(i);
col.Width := 80;
end;
// add columns
for I := 0 to 3 do
begin
item := ListView.Items.Add;
item.Caption := 'ItemCaption';
// add subitems for each column
for j := 0 to 1 do
begin
item.SubItems.Add('subitem ' + IntToStr(j+1));
end;
end;
subItemCount := 5;
end;
procedure TForm1.OnAddClick(Sender: TObject);
var number: integer;
col: TListColumn;
i: Integer;
ascii: char;
begin
listview.Columns.BeginUpdate;
number := StrToInt(editColumn.Text);
ascii := Chr(65 + number);
// create the new column
col := TListColumn(ListView.Columns.add());
col.Width := 80;
col.Caption := ascii;
// add the new subitems
for I := 0 to ListView.Items.Count-1 do
begin
ListView.Items[i].SubItems.Add('subitem ' + ascii);
end;
// move it to the designated position
col.Index := number;
listview.Columns.EndUpdate;
Inc(subItemCount);
end;
end.
謝謝!
編輯:從Sertac Akyuz建議的修復工作正常,但由於改變了德爾福源代碼是爲我的項目沒有解決方案,我無法使用它。報告錯誤。
編輯:刪除了第一個帖子中未包含的第二個問題,並打開了新問題(請參閱鏈接問題和問題修訂版)。
更新:reported bug現已關閉,如Delphi XE2 Update 4已修復。
我想有一個丟失刷新/更新的地方。不知道它是什麼。也就是說,這聽起來像虛擬模式列表視圖會發光的另一種情況。 –
但它們只能用於.Net,不是嗎?我得到了與C#.Net項目相同的問題,也許可以在那裏使用它。 – torno
編號Windows列表視圖支持虛擬模式,Delphi將其包裝得非常好。如果你在運行時操縱列,它肯定是要走的路。這裏的其他人都會指出你在虛擬樹視圖中,但我自己喜歡本地控制。 –