比如有这样一个字段的纪录如下:
1001
100101
100102
10010201
10010202
1002
100201
10020101
1003
100301
100302
如何用tree控件用目录的形式表示呢?

解决方案 »

  1.   


    function BuildTree(fcTree : TTreeView;cds_DataSet : TClientDataSet;aCodeFld,aNameFld : string;aOtherFld : array of string):Boolean;
    var
      strCode, strName : string;
      curTreeNode : TTreeNode;
    begin
      fcTree.Items.BeginUpdate;
      try
        curTreeNode := nil;
        while not cds_DataSet.Eof do
        begin
          strCode := cds_DataSet.FieldByName(aCodeFld).AsString;
          if strCode = '' then
          begin
            cds_DataSet.Next;
            Continue;
          end;
          strName := cds_DataSet.FieldByName(aNameFld).AsString;
          //查找父节点
          curTreeNode := GetParentTreeNode(curTreeNode,strCode);
          if curTreeNode=nil then curTreeNode:=fcTree.Items.GetFirstNode; 
          //增加节点
          curTreeNode := fcTree.Items.AddChild(curTreeNode,strName);
          curTreeNode.StringData := strCode;
          //取附加内容      cds_DataSet.Next;
        end;
        if fcTree.Items.GetFirstNode<>nil then
          fcTree.Items.GetFirstNode.Expand(false);
        fcTree.Selected := fcTree.Items.GetFirstNode;
      finally
        fcTree.Items.EndUpdate;
      end;
      Result := True;
    end;function GetParentTreeNode(afcTreeNode:TTreeNode;aCode:string):TTreeNode;
    var
      strCode : string;
    begin
      while afcTreeNode <> nil do
      begin
        strCode := afcTreeNode.StringData;
        if Copy(aCode,1,Length(strCode)) = strCode then
          Break;
        afcTreeNode := afcTreeNode.Parent;
      end;
      Result := afcTreeNode;
    end;