表:FLBM  FLMC        BZ    ID    PARENT
  01     日常用品      无     0     -1
  0101   生活用        无     2      0
  0101    学习用       无     3       0
  02    工业用品        无     1      -1
  0201  轻工业         无     4       1
在窗体上放一个TreeView控件, 四个Edit 有三个按钮
要求实现这样的功能:添加同级,就能添加根级,和各个同级;
添加下级就能添加下级,同时表中数据也更新了,还有一个修改的

解决方案 »

  1.   


    procedure TFTestFrm1.AddParentNode(TVNode: TTreeNode; PField: string);
    begin
      TitleNode := tv.Items.Add(nil, '全部');
      TitleNode.ImageIndex := 0;
      qry1.Close;
      qry1.SQL.Text := 'select * from dl where lb=:lb';
      qry1.Parameters.ParamByName('lb').Value := string(PField);
      qry1.Open;
      if qry1.RecordCount > 0 then
      begin
        qry1.First;
        while not qry1.Eof do
        begin
          TVNode := tv.Items.Add(nil, IntToStr(qry1.FieldValues['ptid']) + '-' + qry1.FieldValues['ptname']);
          TVNode.ImageIndex := 0;
          TVNode.SelectedIndex := 1;
          AddParentChildNode(TVNode, IntToStr(qry1.FieldValues['ptid']));
          qry1.Next;
        end;
      end;
    end;
    procedure TFTestFrm1.AddParentChildNode(TVPNode: TTreeNode; PField: string);
    begin
      qry2.Close;
      qry2.SQL.Text := 'select xlid,xlname from xl where parent=:parent';
      qry2.Parameters.ParamByName('parent').Value := PField;
      qry2.Open;
      if qry2.RecordCount > 0 then
      begin
        qry2.First;
        while not qry2.Eof do
        begin
          PChildNode := tv.Items.AddChild(TVPNode, IntToStr(qry2.FieldValues['xlid']) + '-' + qry2.FieldValues['xlname']);
          PChildNode.ImageIndex := 0;
          PChildNode.SelectedIndex := 1;
          qry2.Next;
        end;
      end;
    end;建议楼主选择cxDbTreeview,里面可以设置根节点和节点,添加数据也很方便!
      

  2.   

    顶2楼,其实楼主你只要处理好上下级关系就好了,treeview节点可以存储指针,在那可以保存一下数据信息供你使用
      

  3.   

    这里有一篇,递归处理树形结构
    http://www.52delphi.com/list.asp?ID=6
    以前写的一个函数
    从菜单生成树:
    procedure MenuToTreeView(MainMenu: TMainMenu;  Tree: TTreeView;  RootCaption: string='菜单功能组');
    var
      i: integer;
      Root: TTreeNode;
      procedure CreateTreeByMenuItem(Item: TMenuItem;  ParentNode: TTreeNode);
      var
        i: integer;
        Node,tempNode: TTreeNode;
      begin
        tempNode := TTreeView(ParentNode.TreeView).Items.AddChild(ParentNode,item.Caption);
        for i := 0 to Item.Count - 1 do
        begin
          Node := tempNode;
          if item.Items[i].Count  >  0 then
            CreateTreeByMenuItem(item.Items[i],Node)
          else TTreeView(ParentNode.TreeView).Items.AddChild(tempNode,item.Items[i].Caption);
        end;
      end;
    begin
      Tree.Items.Clear;
      Root := Tree.Items.AddChild(nil,RootCaption);
      for i := 0 to MainMenu.Items.Count - 1 do
        CreateTreeByMenuItem(MainMenu.Items[i],Root);
    end;