比如:产品编号->产品分类->产品....
数据库用sql server2000,
treeview如何与数据库关联?如何实现方便的查找到某个产品.??
如何实现??

解决方案 »

  1.   

    没有这方面的控件吧?读取数据库中的记录将其按一定的树型层次插入到TreeView中不就行了?自己做,很简单的,不超过100行代码。
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGrids;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        Button1: TButton;
        ADOQuery1: TADOQuery;
        Button2: TButton;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TreeView1: TTreeView;
        TabSheet2: TTabSheet;
        DataSource1: TDataSource;
        ADOQuery1ID: TAutoIncField;
        ADOQuery1ParentID: TIntegerField;
        ADOQuery1Name: TWideStringField;
        DBGrid1: TDBGrid;
        Memo1: TMemo;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure FillTreeView(TreeView: TTreeView);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      Close;
    end;procedure TForm1.FillTreeView(TreeView: TTreeView);
      procedure CreateSubTree(FNodeName: string; Node: TTreeNode = nil);
      var
        mLocalName: string;
        TreeNode: TTreeNode;
        Ads_Tmp: TADODataSet;
      begin
        ADS_Tmp := TADODataSet.Create(Self);
        ADS_Tmp.Connection := ADOConnection1;
        with ADS_Tmp do
        try
          Close;
          CommandText := 'Select * from Type Where ParentID =' + FNodeName;
          Open;
          First;
          while not Eof do
          begin
            mLocalName := FieldbyName('ID').Asstring;
            TreeNode := TreeView.Items.AddChild(Node, FieldByName('Name').AsString);
            CreateSubTree(mLocalName, TreeNode); // 此处循环递归
            Next;
          end;
        finally
          ADS_Tmp.Free;
        end;
      end;
    begin
      TreeView.Items.BeginUpdate;
      TreeView.Items.Clear;
      with TreeView.Items.Add(nil, '所有目录') do
      begin
        ImageIndex := 1;
        SelectedIndex := 1;
      end;
      CreateSubTree('0', TreeView.Items[0]);
      TreeView.Items.EndUpdate;
      TreeView.Items[1].Selected := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      FillTreeView(TreeView1);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ADOQuery1.Close;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ADOQuery1.Open;
    end;end.
      

  3.   

    fristykily(firstykily):为什么提示:Form1.ADOQuery1Name doesn't have a corresponding component,remove the declaration
      

  4.   

    procedure TfrmMain.CreateTree;
    var
      DWList,KDList,BJList: TStringList;
      i,j,k: Integer;
      PNode,DWNode,KDNode,BJNode: TTreeNode;
    begin
      TreeView.Items.Clear;
      ADOQ.Close;
      DWList:=TStringList.Create;
      KDList:=TStringList.Create;
      BJList:=TStringList.Create;
      try
        PNode:=TreeView.Items.AddChild(TreeView.Items.GetFirstNode,'班级分布情况');
        PNode.ImageIndex:=0;
        GetBaseData('dwqkb','','',DWList);
        if DWList.Count>0 then begin
          for i:=0 to DWList.Count-1 do begin
            DWNode:=TreeView.Items.AddChild(PNode,DWList[i]);
            DWNode.ImageIndex:=1;
            GetBaseData('kdqkb','单位代码',Copy(DWList[i],1,5),KDList);
            if KDList.Count>0 then begin
              for j:=0 to KDList.Count-1 do begin
                KDNode:=TreeView.Items.AddChild(DWNode,KDList[j]);
                KDNode.ImageIndex:=2;
                GetBaseData('bjxxb','考点代码',Copy(KDList[j],1,4),BJList);
                if BJList.Count>0 then begin
                  for k:=0 to BJList.Count-1 do begin
                    BJNode:=TreeView.Items.AddChild(KDNode,BJList[k]);
                    BJNode.ImageIndex:=3;
                  end;
                end;
              end;
            end;
          end;
        end;
      finally
        DWList.Free;
        KDList.Free;
        BJList.Free;
      end;
    end;
      

  5.   

    procedure TMain.CreateTree(QuerySource:TADOQuery;NodeParent:TTreeNode;treeview1:ttreeview);
    var
      pstr1, pstr2 : ^string;
      NodeTemp : TTreeNode;
    begin
      pstr1 := NodeParent.Data;
      with QuerySource do
      begin
        close;
        sql.Clear;
        sql.Text:='SELECT key,xcode,xname FROM xzdm WHERE parent = ' + '''' + pstr1^ + '''';
        open;
        if isempty then exit;
        NodeTemp := nil;
        while not eof do
        begin
          new(pstr2);
          pstr2^ := FieldByName('key').AsString;
          NodeTemp := TreeView1.Items.AddChildObject(NodeParent,
            trim(FieldByName('xname').AsString)+'('+fieldbyname('xcode').AsString+')', pstr2);
          Next;
        end;
      end;
      while NodeTemp <> nil do
      begin
        CreateTree(QuerySource, NodeTemp,treeview1);
        NodeTemp := Nodetemp.getPrevSibling;
      end;
    end;procedure TMain.RootTree(treeview1:ttreeview);
    var 
      NodeTemp : TTreeNode;
      pstr : ^string;
      Query:TADOQuery;  
    begin
      Query:=TADOQuery.Create(self);
      query.Connection:=BgConnection;
      try
        Treeview1.Items.BeginUpdate;
        with query do
        begin
          SQL.Text :='select top 1 *  from xzdm ';
          open;
          if isempty then exit;
          NodeTemp := nil;
          while not eof  do
          begin
            new(pstr);
            pstr^ := FieldByName('key').AsString;
            NodeTemp :=treeview1.Items.AddObject(nil,
              trim(FieldByName('xname').AsString)+'('+fieldbyname('xcode').AsString+')', pstr);
            Next;
          end;
        end;
        while NodeTemp <> nil do
        begin
          CreateTree(Query, NodeTemp,treeview1);
          NodeTemp:=NodeTemp.getPrevSibling;
        end;
        treeview1.Items.EndUpdate;
      finally
        Query.Free;
      end; 
    end;
      

  6.   

    To  DelphiBird(爱你等于爱自己):
    我把你的代码copy到implementation下面,运行,很多错误:
    [Error] Unit1.pas(23): ';' expected but '.' found
    [Error] Unit1.pas(26): Undeclared identifier: 'TTreeNode'
      

  7.   

    请问这两个组件是delphi自带的吗?PageControl1: TPageControl, TabSheet1: TTabSheet;
      

  8.   

    我用过dxdbtreelist的东东,好象可以的
      

  9.   

    你粘的不全吧!
    ttreenode
    没有
    use  ComCtrls
      

  10.   

    如果数据表设计的好的话一个递归算法就可以把数据表中的数据按照你的分类加载倒TreeView中了。你可以建立一个产品分类表和产品表;也可以就放在一个表中,这个时候你就应该用一个字段标识出是分类还是产品了(这种仅仅用在产品信息很简单的情况下)。tb_ProductClass
    字段名称       长度       类型
    cID             20       varchar
    cName           50       varchar 
    cParentID       20       varchar最主要的就是cParentID,它记录了它的父分类的ID(根结点的ParentID可以用一个特殊值标识),通过这样你就可以很方便的遍历这个数据分类表了。//****************************************************************************//
    //把数据库中的分类结构添加到TreeView上.本过程使用递规算法                     //
    //****************************************************************************//
    procedure Tdm_customer.AddDBTotree(tv: tTreeView;ParentNode:tTreeNode; Key: String);
    var
      aQuery:TClientDataSet;
      SQL,displayCaption,ClassCode:String;
      i:integer;
      treeNode:TTreeNode;
    begin
      aQuery:=TClientDataSet.Create(nil);
      with aQuery do
      begin
        try
          RemoteServer := MainDCOM;
          ProviderName := 'dsp_CusClass';
          CommandText := Format(SQL_SELECT_CUSTOMERCLASS,[QuotedStr(Trim(key))]);
          Open;
          for i:=0 to RecordCount-1 do
          begin
            ClassCode:=fieldByName('cCusClassCode').AsString;
            DisplayCaption:=ClassCode+'  '+
                          FieldbyName('vcCusClassName').AsString;
            TreeNode:=tv.Items.AddChild(ParentNode,DisplayCaption);        AddDBToTree(tv,TreeNode,FieldbyName('cCusClasscode').AsString);        Next;
          end;
        finally
          Free;
        end;
      end;
    end;这段代码只是一个样例,不能直接运行。改一下可以。用在这个地方的目的只是说明用这种方法可以解决这个问题。
      

  11.   

    谢谢指点!因为我对delphi不太熟悉,所以希望可以先看看正确的程序的怎么运作的,如果要我改,可能一时比较难着手了.
      

  12.   

    有这个控件的。你在网上找找。好像叫什么dev express 的。在www。51delphi。com 上有下载的。你可以去看看。:)