现在有一个表,像这样    type       name
                      ----------------------
                        0          红色
                        0          蓝色
                        0          绿色
                        1          大码
                        1          中码
                        1          小码
                        2          春季
                        2          夏季
                        2          秋季
                        2          冬季
现在我只能查表一次,将数据都取出来,显示在两个树型控件中,一个放type,另一个放name,要求点击type的值时,另一个树型控件中显示相应的name值。由于对树型控件不熟,不知道该怎么做,还望各位高手帮忙呀

解决方案 »

  1.   

    no money,no codes  ^_^
    up先
      

  2.   

    为什么不用TreeView 和 ListView来实现呢?
      

  3.   

    先用SQL 语句取出想要的记录,然后在循环里面
     TreeView1.Items.AddChild(TreeView1.Items[x], xxx);
      

  4.   

    你用的哪个树型控件?如果是TTreeView的话,可以在OnChange事件里写这种代码:
    for i:=0 to TreeView1.Items.Count-1 do
     TreeView2.Items.Item[i].Selected:=TreeView1.Items.Item[i].Selected;
      

  5.   

    procedure ZsDataSetToTreeView(mDataSet: TDataSet; mTreeView: TTreeView);
    { 将数据源转换成可视树 }
    type
      TArrayTreeNode = array of TTreeNode;
    var
      vFieldCount: Integer;
      vStringList: TStringList;  procedure pZsDataToTreeNode(mArrayTreeNode: TArrayTreeNode;
        mIndex: Integer; mValueList: string);
      var
        vTreeNode, vTempTreeNode: TTreeNode;
        vStr, S, vTemp: string;
        I: Integer;
        vArrayTreeNode: TArrayTreeNode;
      begin
        vTemp := mValueList;
        vStringList.Text := mValueList;
        vStr := #13#10;
        vTreeNode := nil;
        if mIndex < vStringList.Count then begin
          if (Pred(mIndex) >= Low(mArrayTreeNode)) and (Pred(mIndex) < High(mArrayTreeNode))then
            vTreeNode := mArrayTreeNode[Pred(mIndex)];
          vStr := vStringList[mIndex];
        end;
        vArrayTreeNode := mArrayTreeNode;
        with mDataSet do while not Eof do begin
          S := FieldByName(FieldDefs[mIndex].Name).AsString;
          if (vStr = #13#10) or (vStr <> S) or (mIndex = Pred(vFieldCount)) then
          begin
            vTreeNode := mTreeView.Items.AddChild(vTreeNode,
              FieldByName(FieldDefs[mIndex].Name).AsString);
            vStr := S;
            vTempTreeNode := vTreeNode;
            SetLength(vArrayTreeNode, vFieldCount);
            vArrayTreeNode[mIndex] := vTempTreeNode;
            for I := Succ(mIndex) to Pred(vFieldCount) do begin
              vTempTreeNode := mTreeView.Items.AddChild(vTempTreeNode,
                FieldByName(FieldDefs[I].Name).AsString);
              vArrayTreeNode[I] := vTempTreeNode;
            end;
            vStringList.Clear;
            for I := 0 to Pred(vFieldCount) do
              vStringList.Add(FieldByName(FieldDefs[I].Name).AsString);
            vTemp := vStringList.Text;
            Next;
            pZsDataToTreeNode(vArrayTreeNode, 0, vTemp);
            vArrayTreeNode := nil;
          end else begin
            pZsDataToTreeNode(vArrayTreeNode, Succ(mIndex), vTemp);
          end;
        end;
      end;begin
      vStringList := TStringList.Create;
      mTreeView.Items.Clear;
      vFieldCount := mDataSet.FieldCount;
      mDataSet.First;
      pZsDataToTreeNode(nil, 0, '');
      vStringList.Free;
    end; 
    (摘自《超级猛料》)
      

  6.   

    谢谢 yoic(我是一棵菠菜,菜,菜,菜,菜,菜,菜,) ,这个猛料看来还真不错,我也去下了一个,不过我的意思是,只读一次数据库,将读出的信息分别放在两个树型控件中,点击第一个treeview的时候还能在另一个treeview 中显示相应的数据比如:第一个treeview中放:0,1,2,另一个treeview中放:蓝色、绿色、大码、中码....
    点击第一个treeview中的1时,第二个treeview中显示 大码、中码; 点0 时,显示蓝色、绿色...  注意:因为是远端数据库,要尽量避免从数据库中传数据,只读一次数据库,将数据全读出来
    谢谢各位
      

  7.   

    上面的回答已经解决了问题了啊。将数据得到本地,构好2树,然后在onchange事件中写动作。如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊