0

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つです。

4

1 に答える 1

0

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(Keep it simple bad)!.

時間を無駄にしてごめんなさい。問題をこれまで以上に難しくしようとしたような気がします

于 2016-04-21T14:44:13.910 に答える