我正在使用一个LMDGrid,并希望找到最好的方法来清除它,然后重新填充它。我可以一次删除一行,但这需要很长时间。此外,我已经尝试做- LMDGrid。清除列,然后重新创建列。这只在我没有选择行的情况下有效,一旦选择了行,我就会收到一个Unicode错误。我在想,即使清除列并重新创建它们,我也会导致网格的其他问题。有没有一种方法可以将网格重置或重新初始化回默认状态,或者删除每一行是最好的方法?
如下文所述,LMDGrid是LMD Innovative的网格控件。我正在使用非数据感知网格。
清除网格的代码是
LMDGrid.Columns.Clear; //This clears all of the data and deletes the
//column headers in one shot
//Recreates the column(s)
procedure TForm15.Button1Click(Sender: TObject);
var
cn: TLMDGridTextColumn;
begin
cn := TLMDGridTextColumn.Create(Self);
cn.Title.Caption := 'My column';
cn.Width := 150;
LMDGrid1.Columns.Add(cn);
end;
在重新创建表后运行时,它似乎都正确地加载了数据。然而,当选择一行时,这就是上面提到的问题开始的地方。
就通过for循环一次删除一行的速度而言,即使只有200条记录(4秒),速度也明显慢了。
我正在寻找的是大多数人认为最好的清理网格并重新填充它的方法。
更多的发现。我检查了列计数是什么做列清除后,它报告回来为零。我首先认为它只清除列下的数据,包括头信息。我还认为,通过重新创建这些列,我复制了已经存在但不可见的东西。所以我已经验证了列和行都是0。所以我觉得我需要在插入新的列之前重新初始化网格组件,这部分我不知道该怎么做。
这里是更多的代码。
procedure TContactsForm.GridCreate();
Var
cn1, cn2, cn3, cn4, cn5: TLMDGridTextColumn;
Begin
ContactsGrid.Columns.Clear;
cn1 := TLMDGridTextColumn.Create(Self);
cn1.Title.Caption := 'ID';
cn1.Width := 30;
ContactsGrid.Columns.Add(cn1);
cn2 := TLMDGridTextColumn.Create(Self);
cn2.Title.Caption := 'Company';
cn2.Width := 100;
ContactsGrid.Columns.Add(cn2);
cn3 := TLMDGridTextColumn.Create(Self);
cn3.Title.Caption := 'First Name';
cn3.Width := 85;
ContactsGrid.Columns.Add(cn3);
cn4 := TLMDGridTextColumn.Create(Self);
cn4.Title.Caption := 'Last Name';
cn4.Width := 100;
ContactsGrid.Columns.Add(cn4);
cn5 := TLMDGridTextColumn.Create(Self);
cn5.Title.Caption := 'Phone Number';
cn5.Width := 50;
ContactsGrid.Columns.Add(cn5);
refreshGrid // this repopulates the grid
showmessage('Column Count' + inttostr(ContactsGrid.columns.Count) + 'Row Count' + inttostr(ContactsGrid.DataRowCount))
End;
所以我注意到的是,我可以根据需要多次重新创建列,但是一旦选择了一行并重新创建列,它就不会创建所有列。对选定行的第一次刷新不会创建ID列并产生相应的错误,然后是company列,直到没有创建任何列。
更新。当循环并删除反向或正向的行时,我忘记添加开始update和end update(facepalm)。这大大提高了性能。仍然试图弄清楚列的问题,因为在这个项目中,使用一个网格用于多种用途会很好。
1条答案
按热度按时间bogh5gae1#
我收到了LMD对我的问题的回复。答案如下。列问题是:
MyGrid.Columns[MyColumnIndex].Free;
一个更快的清除网格的方法是:
MyGrid.DataRowCount := 0;