【问题标题】:How would I apply a colour to child nodes only for TcxTreelists?如何仅为 TcxTreelists 将颜色应用于子节点?
【发布时间】:2016-04-20 12:52:42
【问题描述】:

关于 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;

这会在更改父(根)节点时导致访问冲突,并且不会为任何子节点着色。我尝试在节点选择更改事件上添加 Tree.FullRefresh,但这似乎没有任何效果。

我只是希望能够根据节点中存储的数据更改背景和文本颜色。父节点以黑色和白色显示,子节点显示为一整套颜色。

谢谢,

任何我错过的问题或提示我都非常乐意补充。注意:我使用 Node.AddChild 过程添加子节点。

编辑:我认为我已经添加了方法签名,但从未听说过这样称呼它,所以这是我可以在列表中勾选的一个术语。

【问题讨论】:

  • 您联系过 DevExpress 支持吗?他们通常反应很快
  • @TomBrunberg 我查看了该帖子,但找不到“NodeCellStyle”事件,当我尝试访问该链接时,我无法连接到该网站。 Zam 我还没有,等待一封关于创建帐户的非常慢的电子邮件(将是我的交换服务器),但我在等待电子邮件时想,如果我有我的问题有人可能知道。作为一个临时的“修复”,我正在使用 CxStyles,但我想要使用的所有颜色信息都作为整数存储在数据库中。如果这确实是重复的,那么我表示最深切的歉意,并将删除这个问题。
  • 您是否尝试过TreeList.CustomDrawNodeCell event,因为该问题的提问者说对他有用?无论如何,我不使用 devexpress 组件,所以无法真正回答您的问题。
  • @TomBrunberg 我无法找到那个事件。我想知道这是否是树列表的数据感知版本的一部分?我有几个TreeList.OnCustomDraw... events'。我发现最接近的是OnCustomDrawDataCell,但这就是问题所在。我可以让它绘制所有单元格,但不能绘制动态创建的单元格。我感谢您试图指出我可能忽略的领域。这对我来说很有可能,因为我没有过度使用 Devexpress 组件。

标签: delphi devexpress nodes treelist


【解决方案1】:

Devexpress 帐户终于建立起来了!

答案来自他们,但我想如果有人寻找它,我会在这里发布。原来我是个白痴

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;

原来我试图通过将过程拆分为“收集数据”然后应用画布来使其过于复杂。通过将其保持在一起,它可以工作。提醒未来的我 KISS(保持简单愚蠢)!。

抱歉,各位,浪费了你们的时间。感觉我试图让问题变得比以往更难

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 2019-08-30
    • 2011-07-30
    • 2018-02-06
    • 1970-01-01
    • 2015-09-08
    • 2011-10-25
    • 2021-09-20
    • 2023-04-07
    相关资源
    最近更新 更多