有关树型控件的问题(急)

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





9 个解决方案

#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


最后一次up

#8


上面的回答已经解决了问题了啊。

将数据得到本地,构好2树,然后在onchange事件中写动作。

如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊

#9


是吗?还是不太明白,去试试先,分先发了。

#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


最后一次up

#8


上面的回答已经解决了问题了啊。

将数据得到本地,构好2树,然后在onchange事件中写动作。

如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊

#9


是吗?还是不太明白,去试试先,分先发了。