如何通过 delphi xe5 上的代码触发网格双右边框单击事件?
How to fire grid double right border click event by code on delphi xe5?
我正在使用 Dev Express DBGrid 组件,我想缩放我的列以适合我的行文本,所以我使用了:
cxView.ApplyBestFit();
这行得通,但不知何故太慢了,所以我进行了一些搜索并找到了这个 post on Dev Express Website 但这对我帮助不大。所以我开始观察网格交互性是什么让我发现如果我一个接一个地双击网格的所有右边界,网格将完美快速地缩放
正如您在下面的两张图片中看到的那样:
然后我继续到最后一个边界得到这个结果:
我正试图通过代码触发这种双击,但我缺乏 Delphi 和 Dev Express 的经验。那么如何在所有列中依次触发这个事件呢
谢谢
下面的代码将与 double-clicking 每个 header 单元格的右侧相同。
代码:
procedure TForm1.ApplyBestFits;
var
i : Integer;
begin
try
cxGrid1DBTableView1.BeginUpdate;
for i := 0 to cxGrid1DBTableView1.ColumnCount - 1 do begin
cxGrid1DBTableView1.Columns[i].ApplyBestFit;
end;
finally
cxGrid1DBTableView1.EndUpdate;
end;
end;
但是,我不确定它是否能完全解决您的问题。
在我的测试用例中,有 100 列和 2000 行数据,需要一两秒钟才能
执行,我想这比你希望的要慢得多。所以它可能需要一些优化。
一个明显的优化是只调用 cxGrid1DBTableView1.Columns[i].ApplyBestFit
对于 DBTableView 的客户端矩形内的列。另一个可能是限制
连接到表视图的数据集中的行数减少。例如,以下仅对左坐标在 cxGrid 宽度范围内的列调用 ApplyBestFit。
procedure TForm1.ApplyBestFits;
var
i : Integer;
ALeft : Integer;
ACol : TcxGridColumn;
begin
try
ALeft := 0;
cxGrid1DBTableView1.BeginUpdate;
// Process only the visible columns whose Left properties
// are within the width of the grid
for i := 0 to cxGrid1DBTableView1.VisibleColumnCount - 1 do begin
ACol := cxGrid1DBTableView1.VisibleColumns[i];
ACol.ApplyBestFit;
Inc(ALeft, ACol.Width);
if ALeft > cxGrid1.Width then
Break;
end;
finally
cxGrid1DBTableView1.EndUpdate;
end;
end;
我正在使用 Dev Express DBGrid 组件,我想缩放我的列以适合我的行文本,所以我使用了:
cxView.ApplyBestFit();
这行得通,但不知何故太慢了,所以我进行了一些搜索并找到了这个 post on Dev Express Website 但这对我帮助不大。所以我开始观察网格交互性是什么让我发现如果我一个接一个地双击网格的所有右边界,网格将完美快速地缩放 正如您在下面的两张图片中看到的那样:
然后我继续到最后一个边界得到这个结果:
我正试图通过代码触发这种双击,但我缺乏 Delphi 和 Dev Express 的经验。那么如何在所有列中依次触发这个事件呢
谢谢
下面的代码将与 double-clicking 每个 header 单元格的右侧相同。
代码:
procedure TForm1.ApplyBestFits;
var
i : Integer;
begin
try
cxGrid1DBTableView1.BeginUpdate;
for i := 0 to cxGrid1DBTableView1.ColumnCount - 1 do begin
cxGrid1DBTableView1.Columns[i].ApplyBestFit;
end;
finally
cxGrid1DBTableView1.EndUpdate;
end;
end;
但是,我不确定它是否能完全解决您的问题。 在我的测试用例中,有 100 列和 2000 行数据,需要一两秒钟才能 执行,我想这比你希望的要慢得多。所以它可能需要一些优化。
一个明显的优化是只调用 cxGrid1DBTableView1.Columns[i].ApplyBestFit
对于 DBTableView 的客户端矩形内的列。另一个可能是限制
连接到表视图的数据集中的行数减少。例如,以下仅对左坐标在 cxGrid 宽度范围内的列调用 ApplyBestFit。
procedure TForm1.ApplyBestFits;
var
i : Integer;
ALeft : Integer;
ACol : TcxGridColumn;
begin
try
ALeft := 0;
cxGrid1DBTableView1.BeginUpdate;
// Process only the visible columns whose Left properties
// are within the width of the grid
for i := 0 to cxGrid1DBTableView1.VisibleColumnCount - 1 do begin
ACol := cxGrid1DBTableView1.VisibleColumns[i];
ACol.ApplyBestFit;
Inc(ALeft, ACol.Width);
if ALeft > cxGrid1.Width then
Break;
end;
finally
cxGrid1DBTableView1.EndUpdate;
end;
end;