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