TreeView中建立了如下三层树型结构:
—学校1
|    |
|    —年级1
|    |    |
|    |    —班级1
|    |  |
|    |    —班级2
|    |
|    —年级2
|    |
|    —年级3
|
—学校2
|
—学校3这个结构是根据数据库里面的值动态建立起来的
现在想用3个ComboBox来实现这样一个功能:
ComboBox1,一旦用户下拉这个组合框,就将根节点的名称放入ComboBox1的item中让用户选(也就是学校那一级的所有名称)
用户点中ComboBox1的一个item后(比如学校1),就将第二级节点(也就是学校1下面的所有年级)选出放入ComboBox2的item中
用户点中ComboBox2的一个item后(比如年级1),就将第二级节点(也就是年级1下面的所有班级)选出放入ComboBox3的item中因为如果ComboBox中的item也用数据库查询来加入的话,受网络影响可能会很慢,所以想不通过数据库,直接让ComboBox跟TreeView发生关系来实现上述功能。小弟在ComboBox的OnDropDown事件中,想取treeview1.selected.text这种方法实现,却总做不成功,运行时下拉框一拉下就很快的缩上去。请问有没有方便快捷的方式?最好能提供一个参考的源代码,谢谢

解决方案 »

  1.   

    你可以使用本地数据缓存来实现。建立树的时候,你肯定要读取数据库中的内容,对不对?此时就可以先将数据存储到本地数据集中,比如一份xml,或者树结点的Data指针中,或者ClientDataset中(我常用这种方式,但要依赖midas.dll)。当树建造完成后,也可以一并填充Combobox1(这样就用不着什么事件了,不用等用户下拉组合框,对不对?),然后在ComboBox1的OnChange事件中检索数据,将正确的数据填入ComboBox2,以此类推。
      

  2.   

    你可以设置一个单元变量,在TreeView的OnChange事件中将当前选中的节点的Text赋值给这个变量,然后就可以在ComboBox1的OnChange事件中检索数据,将检索到的数据填入到ComboBox2就可以了。
      

  3.   

    不好意思,小弟是新手,所以对Miracle兄给的建议不是很熟悉。对本地数据集没有接触过,不太清楚怎么做
      

  4.   

    用三个dataset分别将这三个级别(学校\年级\班级)的数据载入.可以用这三个dataset生成树结构(应该是用filter)吧.
    再在相应的事件中,使用适当的dataset中的数据重新填充相应的comobox即可.这样当然不会再受网络影响了.
    当然也可以将相应的信息填入到树结点的Data指针中,但这样你需要先构造一个记录类型(可参看treeview的addobject?帮助中示例)
      

  5.   

    procedure TForm1.ComboBox1DropDown(Sender: TObject);
    var
    tn:TTreeNode;
    begin
      tn:=treeview1.Items.GetFirstNode;
      while tn<>nil do begin
        combobox1.Items.Add (tn.Text);
        tn:=tn.getNextSibling;
      end;
    end;
      

  6.   

    procedure TForm1.ComboBox1CloseUp(Sender: TObject);
    var
    tn:TTreeNode;
    begin
    tn:=treeview1.Items.GetFirstNode;
    while (tn<>nil) and (tn.Text<>combobox1.Text) do
      tn:=tn.getNextSibling;if (tn=nil) or (tn.text<>combobox1.Text) then begin
    showMessage('Error!');Exit; end;
    tn:=tn.getFirstChild;
      while tn<>nil do begin
        combobox2.Items.Add (tn.Text);
        tn:=tn.getNextSibling;
      end;end;參考一下
      

  7.   

    建议使用第三方控件,如果需要和我联系[email protected]
      

  8.   

    呵,谢谢几位啦。我后来自己采用了树的遍历,上来一看跟frogshero(三波萝)兄的方法很类似,自卖自夸的在这里贴一下吧:
    //将第一层节点加入ComboBox1中
    procedure TForm1.FormShow(Sender: TObject);
    var
       rootnode : TTreeNode;
    begin
       TreeView1.SetFocus;
       rootnode:= treeview1.Selected;
       ComboBox1.Items.Add(TreeView1.Selected.Text);
       while TreeView1.Selected.getNextSibling<>nil do
          begin
             TreeView1.Selected:= TreeView1.Selected.getNextSibling;
             ComboBox1.Items.Add(TreeView1.Selected.Text);
          end;
       TreeView1.Selected:= rootnode;
    end;//按ComboBox1的选择将第二层节点加入ComboBox2中
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
       rootnode : TTreeNode;
       selectnode : TTreeNode;
       childnode : TTreeNode;
    begin
       ComboBox2.Items.Clear;
       selectnode:= TreeView1.Selected;
       while TreeView1.Selected.getPrevSibling<>nil do
          begin
             selectnode:= TreeView1.Selected.getPrevSibling;
             TreeView1.Selected:= selectnode;
          end;
       rootnode:= selectnode;
       repeat
          selectnode:= TreeView1.Selected;
          if TreeView1.Selected.getNextSibling<>nil then
             TreeView1.Selected:= TreeView1.Selected.getNextSibling
          else
             TreeView1.Selected:= rootnode;
       until selectnode.Text=ComboBox1.Items[ComboBox1.ItemIndex];
       //Edit1.Text:= selectnode.Text;
       if selectnode.getFirstChild<>nil then
          begin
             childnode:= selectnode.getFirstChild;
             ComboBox2.Items.Add(childnode.Text);
             while childnode<>nil do
                begin
                  if childnode.getNextSibling<>nil then
                     begin
                         childnode:= childnode.getNextSibling;
                         ComboBox2.Items.Add(childnode.Text);
                     end
                  else
                     childnode:= nil;
                end;
          end
       else
          ComboBox2.Items.Add('');
    end;//按照ComboBox1、ComboBox2的选择将第三层节点加入ComboBox3中
    procedure TForm1.ComboBox2Change(Sender: TObject);
    var
       rootnode : TTreeNode;
       fathernode : TTreeNode;    //供电局
       selectnode : TTreeNode;    //变电所
       childnode : TTreeNode;     //计量点
    begin
       ComboBox3.Items.Clear;
       fathernode:= TreeView1.Selected;
       while TreeView1.Selected.getPrevSibling<>nil do
          begin
             fathernode:= TreeView1.Selected.getPrevSibling;
             TreeView1.Selected:= fathernode;
          end;
       rootnode:= fathernode;
       repeat
          fathernode:= TreeView1.Selected;
          if TreeView1.Selected.getNextSibling<>nil then
             TreeView1.Selected:= TreeView1.Selected.getNextSibling
          else
             TreeView1.Selected:= rootnode;
       until fathernode.Text=ComboBox1.Items[ComboBox1.ItemIndex];   if fathernode.getFirstChild=nil then
          begin
             ComboBox3.Items.Add('');
             exit;
          end
       else
          selectnode:= fathernode.getFirstChild;   rootnode:= selectnode;
       if selectnode.Text<>combobox2.Items[ComboBox2.ItemIndex] then
          begin
             repeat
                if selectnode.getNextSibling<>nil then
                   selectnode:= rootnode
                else
                   selectnode:= selectnode.getNextSibling;
             until selectnode.Text=combobox2.Items[ComboBox2.ItemIndex];         if selectnode.getFirstChild=nil then
                ComboBox3.Items.Add('')
             else
                begin
                   childnode:= selectnode.getFirstChild;
                   while childnode<>nil do
                      begin
                         ComboBox3.Items.Add(childnode.Text);
                         childnode:= childnode.getNextSibling;
                      end;
                end;
          end
       else
          begin
             if selectnode.getFirstChild=nil then
                ComboBox3.Items.Add('')
             else
                begin
                   childnode:= selectnode.getFirstChild;
                   while childnode<>nil do
                      begin
                         ComboBox3.Items.Add(childnode.Text);
                         childnode:= childnode.getNextSibling;
                      end;
                end;
          end;
       end;