كيف أقوم بتلوين cxgrid بناءً على قيمة الجدول؟
-
08-09-2020 - |
سؤال
أرغب في الحصول على جميع الصفوف حيث يوجد اسم حقل معين "Hello" للحصول على اللون الأخضر الملون.لقد حاولت هذا customdrawcell
:
if abstable1.fieldbyname('somename').asstring = 'Hello' then
cxgrid.canvas.brush.color:=clGreen
لكنها لن تنجح...ما الذي أفتقده هنا؟
المحلول
لا تحاول تغيير ألوان القماش في الشبكة.بالأحرى - وأجد هذا ل دائماً يكون صحيحا--تغيير الألوان في منظرمعالج OnDrawCell، كما في هذا المثال:
procedure T_fmTabSnapList.View1CustomDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if abstable1.fieldbyname('somename').asstring = 'Hello' then
ACanvas.Brush.Color := clGreen
end;
يعد cxGrid مجرد حاوية لطرق العرض.المشاهدات هي المكان الذي تحدث فيه كل اللوحة.س
نصائح أخرى
استخدم الحدث OnGetContentStyle للأعمدة الفردية أو لكائن الشبكة.يعد التعامل مع الأنماط أسهل بكثير من العبث باللوحة القماشية.
يتعين عليك إلقاء نظرة على البيانات الداخلية لكل صف عرض بدلاً من بيانات الموضع الحالي في الجدول.استفد أيضًا من اللوحة القماشية المتوفرة في حدث OnCustomDrawCell().
procedure TForm1.YourViewCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if(AViewInfo.GridRecord.Values[YourColumn.Index] = 'Hello') then
ACanvas.Brush.Color := clGreen;
end;
procedure Tfm1.Grid1StylesGetContentStyle(Sender: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AStyle: TcxStyle);
Var
Style1: TcxStyle;
begin
if AItem = nil then exit;
if ARecord.Values[Grid1Med.Index] = true then
AStyle := cxStyleMed;
if ARecord.Values[Grid1CP.Index] = true then
AStyle := cxStyleHost;
if (ARecord.Values[Grid1Med.Index] = true) and
(ARecord.Values[Grid1CP.Index] = true) then
AStyle := cxStyleHostAndCP;
if not VarIsNull(ARecord.Values[colColor.Index]) then
begin
if not Assigned(AStyle) then
AStyle := TcxStyle.Create(Sender);
AStyle.Color := ARecord.Values[colColor.Index];
end;
end;
إليك بعض أكواد العمل من أحد البرامج الخاصة بي والتي تقوم بشيء مماثل.
procedure TDoDockets.grDocketsDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with grDockets do
begin
if (qDocketsOpenCost.asinteger > 1) and (datacol = 5)
then canvas.font.color:= clRed;
if datacol = 9 then // status
if qDocketsColour.Value <> 0
then Canvas.font.color:= tcolor (qDocketsColour.Value);
if datacol = 10 then // attention
if qDocketsAttention.asinteger = 1
then canvas.brush.color:= clRed;
if qDocketsUrgent.asinteger = 1 then canvas.brush.color:= 10092543;
// light yellow
DefaultDrawColumnCell (Rect, DataCol, Column, State);
end
end;
grDockets هي الشبكة، وqDockets هو الاستعلام الذي يتم عرضه داخل الشبكة.قد يتم رسم أعمدة معينة بلون مختلف اعتمادًا على القيمة المعروضة، وفي حالة واحدة (qDocketsUrgent = 1)، يتغير لون خلفية السطر بأكمله.