如何从OnCustomDrawCell事件处理程序控制单元格的宽度?

时间:2013-10-23 15:28:58

标签: delphi tcxgrid

我使用OnCustomDrawCell事件处理程序在单元格中绘制位图和文本。调用ApplyBestFit会使单元格的宽度符合位图,但不适合文本。

例如,位图的宽度为16,文本的宽度为100.调用ApplyBestFit后,单元格的宽度将为100(对应于文本的宽度),我会看到位图和文本的一部分(84px)。

我希望单元格的宽度为116,以便适合位图和文本。

是否可以在OnCustomDrawCell事件处理程序中设置所需的单元格宽度?

2 个答案:

答案 0 :(得分:1)

您可以覆盖TcxCustomGridTableItem.CalculateBestFitWidth并将所需空间添加到函数的结果中。在下面的示例中,使用派生类TcxGridDBColumn。 如果您使用的是TcxGridTableView,则必须插入TcxGridColumn,如果您使用的是TcxGridDBBandedTableView,则必须插入TcxGridDBBandedColumn等等... 的修改
正如@tikskit正确提到的,如果需要在运行时创建列(例如,通过调用View.DataController.CreateAllItems()),则必须覆盖使用的视图类的GetItemClass,以便创建插入的类

type
  TcxGridDBTableView=Class(cxGridDBTableView.TcxGridDBTableView)
    function GetItemClass: TcxCustomGridTableItemClass; override;
  End;

  TcxGridDBColumn=Class(cxGridDBTableView.TcxGridDBColumn)
     function CalculateBestFitWidth: Integer;override;
  End;

  TForm3 = class(TForm)
    v: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
    vID: TcxGridDBColumn;
    vName: TcxGridDBColumn;
    .....
    .....
var
  Form3: TForm3;

implementation

{$R *.dfm}

{ TcxGridDBColumn }

function TcxGridDBColumn.CalculateBestFitWidth: Integer;
begin
  Result := inherited CalculateBestFitWidth;
  Result := Result + 16;
end;

{ TcxGridDBTableView }


function TcxGridDBTableView.GetItemClass: TcxCustomGridTableItemClass;
begin
   inherited;
  Result := TcxGridDBColumn;
end;

答案 1 :(得分:0)

声明对TcxCustomGridTableItem的访问类:

type
  TcxCustomGridTableItemAccess = class(TcxCustomGridTableItem);

并在您的方法中执行:

procedure Test.cxGrid1DBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if Assigned(AViewInfo) and Assigned(AViewInfo.Item) then
    TcxCustomGridTableItemAccess(AViewInfo.Item).Width := 116; // or calc here your new width
end;