我使用OnCustomDrawCell
事件处理程序在单元格中绘制位图和文本。调用ApplyBestFit
使单元格的宽度足以适合位图,但不足以适合文本。
例如位图的宽度为16,文本的宽度为100。调用后ApplyBestFit
单元格的宽度将为100(对应于文本的宽度),我将看到位图和一部分(84px)文本。
我希望单元格的宽度为 116,以便同时适合位图和文本。
是否可以在OnCustomDrawCell
事件处理程序中设置所需的单元格宽度?
您可以覆盖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;
声明一个对 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;