devexpress ツリーリストに関する別の質問。グリッドに格納されている値に基づいて行に色を付ける cxgrid を取得することができました。この知識をツリーリストに移そうとする私の試みはうまくいきませんでした。現在、グリッド全体が色付けされており、子ノードはデフォルトのままです(白い背景に黒いテキスト)。
問題は、子ノードがいつどのように設定されるかに関するものだと思います。現在、それらは動的に入力され、選択が変更されると削除されます。
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;
このままでは問題なく動作します。すべての情報で必要なことを実行できます。ただし、リスト全体は白黒です。子ノードの違いを識別しやすくするために、作成プロセス中に収集された情報 (DB オブジェクト) に基づいて色を付けたいと思います。
現在のカスタム ドロー:
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 プロシージャを使用して子ノードを追加します。
編集:メソッドシグネチャを追加したと思いますが、それが呼び出されるのを聞いたことがないので、リストにチェックマークを付けることができる用語の1つです。