如何通过delphi xe5上的代码触发网格双右边界点击事件?

时间:2016-09-20 15:15:52

标签: delphi devexpress delphi-xe5 dbgrid

我正在使用Dev Express DBGrid组件,我想缩放我的列以适合我的行文本,所以我使用了:

{{1}}

虽然有效,但速度太慢,所以我做了一些搜索,我找到了这篇文章on Dev Express Website,但这对我没什么帮助。所以我开始观察网格交互性,这让我发现,如果我一个接一个地双击网格的所有右边界,网格将完美而快速地缩放 如下图所示:

that was the 4th right border click

然后我继续到最后一个边界来获得这个结果:

As you see is well scaled

我试图通过代码拼命点击这次双击,但我缺乏Delphi和Dev Express的经验。那么如何在所有列中逐个连续触发此事件。

谢谢

1 个答案:

答案 0 :(得分:2)

下面的代码与双击每个标题单元格的rhs相同。

代码:

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的客户端rect内的列。另一种可能是限制 连接到tableview的数据集中的行数为较小的数字。例如,以下仅将ApplyBestFit调用到其Left坐标位于cxGrid宽度内的列。

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;