Delphi cxtreelist遍历节点

我有一个包含3列的tcxTreeList,第一列具有set属性 Node.CheckGroupType := ncgCheckGroup;,第二列包含第一个根节点的密钥,第三列包含根节点下的所有子节点的密钥。 我如何获取根节点的密钥(无论是否已选中)以及所有已检查的子节点的密钥到2个变量中以插入到db中,以及从我们从DB中获得的密钥中加载项

Delphi cxtreelist遍历节点

我添加项目的代码如下

 APNode := tv.Add;
 APNode.CheckGroupType := ncgCheckGroup;
 APNode.Values[0] := define;
 ApNode.Values[1] := dCode;

定义-包含“创建”,“发布”,“活动中”等文本。 dcode-包含每个根节点的键值,例如E,F,I,P,R

这是我为每个根节点添加子节点的方式

procedure TF_Form1.addPStatsToTreeList(tl: TcxTreeList; const dcode,define: string);
  function AddTreeListNode(TreeList: TcxTreeList; APNode: TcxTreeListNode; const AValues: Array of Variant; AImageIndex: Integer): TcxTreeListNode;
  begin
    Result := TreeList.AddChild(APNode);
    Result.AssignValues(AValues);
    Result.Imageindex := AImageIndex;
  end;
var
  grpnode,chNode,ANode: TcxTreeListNode;
  icnt : integer;
begin
  icnt := tl.Count;
  if Assigned(tl) then
  begin
    ANode := tl.TopNode;
    while ANode <> nil do
    begin
      ANode :=  AddTreeListNode(tl,ANode,[define,'',dcode],0);
      ANode := TcxTreeListNode(ANode.GetNext);
    end;
  end;
end;

更新

dcode是一个字母,Definition是一个字符串,Dcode是定义字符串的键,就像键值对一样,Dcode是键,定义是值。 在树形列表中,根节点(如“创建”,“发布”,“处于活动”,“已检查”和“重新激活”)具有不同的“密钥”(位于第1列),而子节点值(如“样本”,“开发”,“生产”等)的密钥位于第3列。 仅将密钥值保存到DB,无论是否选中根节点密钥,都直接保存。每个根节点密钥将保存到不同的行中,并且仅进入子节点。选中的节点密钥以逗号分隔的形式保存到DB。 例如 。如果选中了创建的根节点及其下的项目(如Sample,Development),则根节点密钥E是一列[DEFCODE(Primarykey)],而逗号分隔的子节点密钥M,E(DEFINITION)在另一列中

a316190862 回答:Delphi cxtreelist遍历节点

下面的代码显示如何将根节点的Checked状态及其根节点保存到TClientDataSet中 键及其子键的列表(以逗号分隔),使用 方法SaveTreeState。

方法LoadTreeState清除ctTreeList中每个节点的Checked状态 然后从CDS重新加载已保存的Checked状态。

要使用此代码,您需要将一个名为CDS1的TClientDataSet添加到您的项目中, 然后以通常的方式连接一个TDataSource和TDBGrid。然后添加持久性 代码中显示的CDS字段,然后编译并运行。

我希望我了解您的cxTreeList的设置正确,但是如果没有,希望 该代码应该非常简单,以适应您的实际工作。

type
  TForm1 = class(TForm)
    cxTreeList1: TcxTreeList;
    CDS1: TClientDataSet;
    btnLoad: TButton;
    cxTreeList1Column1: TcxTreeListColumn;
    cxTreeList1Column2: TcxTreeListColumn;
    cxTreeList1Column3: TcxTreeListColumn;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    CDS1RootKey: TStringField;    // String[1]
    CDS1CheckedChildKeys: TStringField;  //  String[20]
    CDS1RootNodeChecked: TBooleanField;
    btnClear: TButton;
    procedure btnClearClick(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure SaveTreeState;
    procedure ClearChecks;
    procedure LoadTreeState;
  end;

[...]
procedure TForm1.ClearChecks;
var
  i,j : Integer;
begin
  for i := 0 to cxTreeList1.Count - 1 do begin
    cxTreeList1.Items[i].Checked := False;
    for j := 0 to cxTreeList1.Items[i].Count - 1 do begin
      cxTreeList1.Items[i].Items[j].Checked := False;
    end;
  end;
end;

procedure TForm1.SaveTreeState;
var
  i,j : Integer;
  RootNode,ChildNode : TcxTreeListNode;
  RootKey,ChildKeys : String;
begin
  CDS1.DisableControls;
  try
    CDS1.EmptyDataSet;

    for i := 0 to cxTreeList1.Count - 1 do begin
      RootNode := cxTreeList1.Items[i];
      RootKey := RootNode.Values[1];
      ChildKeys := '';
      for j := 0 to RootNode.Count - 1 do begin
        ChildNode := RootNode.Items[j];
        if ChildNode.Checked then begin
          if ChildKeys <> '' then
            ChildKeys := ChildKeys + ',';
          ChildKeys := ChildKeys + ChildNode.Values[2];
        end;
      end;
      CDS1.InsertRecord([RootKey,ChildKeys,RootNode.Checked]);
    end;
  finally
    CDS1.EnableControls;
  end;
end;

procedure TForm1.LoadTreeState;
var
  RootKey,ChildKey : String;
  ChildKeys : TStringList;
  i : Integer;
  RootNode,ChildNode : TcxTreeListNode;

  function FindRootNodeByKey(const Key : String) : TcxTreeListNode;
  var
    i : Integer;
  begin
    for i := 0 to cxTreeList1.Count - 1 do begin
      Result := cxTreeList1.Items[i];
      if CompareText(Result.Values[1],Key) = 0 then
        Exit;
    end;
    Result := Nil;
  end;

  function FindChildNodeByKey(ParentNode : TcxTreeListNode; const Key : String) : TcxTreeListNode;
  var
    i : Integer;
  begin
    for i := 0 to ParentNode.Count - 1 do begin
      Result := ParentNode.Items[i];
      if CompareText(Result.Values[2],Key) = 0 then
        Exit;
    end;
    Result := Nil;
  end;

begin
  cxTreeList1.BeginUpdate; // prevent treelist from updating while we load its state
  ClearChecks;
  try
    //  ChildKeys is a TStringList that we'll use to parse the list of child keys into individual values
    ChildKeys := TStringList.Create;
    try
      CDS1.DisableControls;
      try
        CDS1.First;
        while not CDS1.Eof do begin
          RootKey := CDS1RootKey.AsString;
          RootNode := FindRootNodeByKey(RootKey);
          Assert(RootNode <> Nil);  // check that we found the root node
          RootNode.Checked := CDS1RootNodeChecked.AsBoolean;
          ChildKeys.CommaText := Trim(CDS1CheckedChildKeys.AsString);  // Loading ChildKeys 
          //  by this assignment is what causes it to be parsed into individual keys
          for i := 0 to ChildKeys.Count - 1 do begin
            ChildKey := ChildKeys[i];
            ChildNode := FindChildNodeByKey(RootNode,ChildKeys[i]);
            Assert(ChildNode <> Nil);
            ChildNode.Checked := True;
          end;
          CDS1.Next;
        end;
      finally
        CDS1.EnableControls;
      end;
    finally
      ChildKeys.Free;
    end;
  finally
    cxTreeList1.EndUpdate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CDS1.CreateDataSet;
  ClearChecks;
end;

procedure TForm1.btnClearClick(Sender: TObject);
begin
  ClearChecks;
end;

procedure TForm1.btnLoadClick(Sender: TObject);
begin
  LoadTreeState;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
  SaveTreeState;
end;

end.
本文链接:https://www.f2er.com/3051920.html

大家都在问