0

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

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

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

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

4

2 回答 2

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;
于 2013-10-23T15:52:44.830 回答
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;
于 2013-10-23T16:00:37.600 回答