我如何将颜色仅应用于 TcxTreelists 的子节点?
How would I apply a colour to child nodes only for TcxTreelists?
关于 devexpress 树列表的另一个问题。我已经设法让 cxgrid 根据存储在网格中的值为行着色。我将这些知识转移到树列表中的尝试并不顺利。我目前将整个网格着色,子节点保留为默认值(白色背景上的黑色文本)。
我认为问题在于何时以及如何填充子节点。 Currently they are dynamically populated, and deleted, when the selection changes.
var
LNode : TcxTreeListNode;
LListData : TOfferList;
LSiteData : TSiteList;
LContract : TItem;
begin
LNode := TreeTypes.FocusedNode;
if Assigned(LNode) then
begin
if LNode.Level = 0 then
begin
LNode.DeleteChildren; //clear children so that list doesnt get duplicate entries / children
LSiteData := TSiteList(LNode.Data); //root node info
PopulateOfferList; //populate children list with data from DB
InitialiseOffers; // populate treelist with children gathered from the list above
LNode.Expand(True);
end
else
begin
LListData := TOfferList(LNode.Data); //do stuff with selected child node
LContract := TItem.Create(LListData.UnitID);//do stuff with selected child node
end;
end;
end;
目前的效果很好。我可以用所有信息做我需要做的事。然而,整个列表是黑白的。为了帮助识别子节点中的任何差异,我希望根据填充过程中收集的信息(数据库对象)对它们进行着色。
当前自定义开奖:
procedure TFrmTestView1.TreeTypesCustomDrawDataCell(Sender: TcxCustomTreeList;
ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
var ADone: Boolean);
var
LState : TStates;
LOffer : TOfferList;
begin
if (Assigned(AViewInfo)) and (Assigned(AViewInfo.Node)) then
begin
if AViewInfo.Node.Level > 0 then
begin
LOffer := AViewInfo.Node.Data;
LState := FGlobals.GetStateFromID(LOffer.StateID);
end;
end;
if AViewInfo.Node.Level > 0 then
begin
if Assigned(LState) then
begin
ACanvas.Brush.Color := LState.Background;
ACanvas.Font.Color := LState.Foreground;
end;
end;
这会在更改父(根)节点时导致访问冲突,并且不会为任何子节点着色。我尝试在 nodeselectionchange 事件上添加 Tree.FullRefresh,但似乎没有任何效果。
我只想根据存储在节点中的数据更改背景和文本颜色。父节点显示为黑白,子节点显示为一整套颜色。
谢谢,
我很乐意补充任何我遗漏的问题或提示。注意:我使用 Node.AddChild 过程添加子节点。
编辑:我想我已经添加了方法签名,但从未听说过这样称呼,所以这是一个我可以在列表中勾选的术语。
Devexpress 帐户终于设置好了!
答案来自他们,但我想我会 post 如果有人要找的话,我会把它放在这里。原来我是个白痴
var
LState : TStates;
LOffer : TOfferList;
begin
if AViewInfo.Node.Level > 0 then
begin
LOffer := TOfferList(AViewInfo.Node.Data);
LState := FGlobals.GetStateFromTag(LOffer.StateTag);
ACanvas.Brush.Color := LState.Background; //integer stored in db
ACanvas.Font.Color := LState.Foreground; //integer stored in db
end;
end;
原来我试图通过将程序拆分为 'gathering data' 然后应用 canvas 来过度复杂化它。通过将它放在一起它可以工作。留给未来的我 KISS(Keep it simple stupid)!.
对不起,浪费你们的时间。感觉我试图让问题变得比以往任何时候都更难
关于 devexpress 树列表的另一个问题。我已经设法让 cxgrid 根据存储在网格中的值为行着色。我将这些知识转移到树列表中的尝试并不顺利。我目前将整个网格着色,子节点保留为默认值(白色背景上的黑色文本)。
我认为问题在于何时以及如何填充子节点。 Currently they are dynamically populated, and deleted, when the selection changes.
var
LNode : TcxTreeListNode;
LListData : TOfferList;
LSiteData : TSiteList;
LContract : TItem;
begin
LNode := TreeTypes.FocusedNode;
if Assigned(LNode) then
begin
if LNode.Level = 0 then
begin
LNode.DeleteChildren; //clear children so that list doesnt get duplicate entries / children
LSiteData := TSiteList(LNode.Data); //root node info
PopulateOfferList; //populate children list with data from DB
InitialiseOffers; // populate treelist with children gathered from the list above
LNode.Expand(True);
end
else
begin
LListData := TOfferList(LNode.Data); //do stuff with selected child node
LContract := TItem.Create(LListData.UnitID);//do stuff with selected child node
end;
end;
end;
目前的效果很好。我可以用所有信息做我需要做的事。然而,整个列表是黑白的。为了帮助识别子节点中的任何差异,我希望根据填充过程中收集的信息(数据库对象)对它们进行着色。
当前自定义开奖:
procedure TFrmTestView1.TreeTypesCustomDrawDataCell(Sender: TcxCustomTreeList;
ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
var ADone: Boolean);
var
LState : TStates;
LOffer : TOfferList;
begin
if (Assigned(AViewInfo)) and (Assigned(AViewInfo.Node)) then
begin
if AViewInfo.Node.Level > 0 then
begin
LOffer := AViewInfo.Node.Data;
LState := FGlobals.GetStateFromID(LOffer.StateID);
end;
end;
if AViewInfo.Node.Level > 0 then
begin
if Assigned(LState) then
begin
ACanvas.Brush.Color := LState.Background;
ACanvas.Font.Color := LState.Foreground;
end;
end;
这会在更改父(根)节点时导致访问冲突,并且不会为任何子节点着色。我尝试在 nodeselectionchange 事件上添加 Tree.FullRefresh,但似乎没有任何效果。
我只想根据存储在节点中的数据更改背景和文本颜色。父节点显示为黑白,子节点显示为一整套颜色。
谢谢,
我很乐意补充任何我遗漏的问题或提示。注意:我使用 Node.AddChild 过程添加子节点。
编辑:我想我已经添加了方法签名,但从未听说过这样称呼,所以这是一个我可以在列表中勾选的术语。
Devexpress 帐户终于设置好了!
答案来自他们,但我想我会 post 如果有人要找的话,我会把它放在这里。原来我是个白痴
var
LState : TStates;
LOffer : TOfferList;
begin
if AViewInfo.Node.Level > 0 then
begin
LOffer := TOfferList(AViewInfo.Node.Data);
LState := FGlobals.GetStateFromTag(LOffer.StateTag);
ACanvas.Brush.Color := LState.Background; //integer stored in db
ACanvas.Font.Color := LState.Foreground; //integer stored in db
end;
end;
原来我试图通过将程序拆分为 'gathering data' 然后应用 canvas 来过度复杂化它。通过将它放在一起它可以工作。留给未来的我 KISS(Keep it simple stupid)!.
对不起,浪费你们的时间。感觉我试图让问题变得比以往任何时候都更难