----------------------
0 红色
0 蓝色
0 绿色
1 大码
1 中码
1 小码
2 春季
2 夏季
2 秋季
2 冬季
现在我只能查表一次,将数据都取出来,显示在两个树型控件中,一个放type,另一个放name,要求点击type的值时,另一个树型控件中显示相应的name值。由于对树型控件不熟,不知道该怎么做,还望各位高手帮忙呀
9 个解决方案
#1
no money,no codes ^_^
up先
up先
#2
为什么不用TreeView 和 ListView来实现呢?
#3
先用SQL 语句取出想要的记录,然后在循环里面
TreeView1.Items.AddChild(TreeView1.Items[x], xxx);
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;
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;
(摘自《超级猛料》)
{ 将数据源转换成可视树 }
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 时,显示蓝色、绿色...
注意:因为是远端数据库,要尽量避免从数据库中传数据,只读一次数据库,将数据全读出来
谢谢各位
点击第一个treeview中的1时,第二个treeview中显示 大码、中码; 点0 时,显示蓝色、绿色...
注意:因为是远端数据库,要尽量避免从数据库中传数据,只读一次数据库,将数据全读出来
谢谢各位
#7
最后一次up
#8
上面的回答已经解决了问题了啊。
将数据得到本地,构好2树,然后在onchange事件中写动作。
如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊
将数据得到本地,构好2树,然后在onchange事件中写动作。
如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊
#9
是吗?还是不太明白,去试试先,分先发了。
#1
no money,no codes ^_^
up先
up先
#2
为什么不用TreeView 和 ListView来实现呢?
#3
先用SQL 语句取出想要的记录,然后在循环里面
TreeView1.Items.AddChild(TreeView1.Items[x], xxx);
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;
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;
(摘自《超级猛料》)
{ 将数据源转换成可视树 }
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 时,显示蓝色、绿色...
注意:因为是远端数据库,要尽量避免从数据库中传数据,只读一次数据库,将数据全读出来
谢谢各位
点击第一个treeview中的1时,第二个treeview中显示 大码、中码; 点0 时,显示蓝色、绿色...
注意:因为是远端数据库,要尽量避免从数据库中传数据,只读一次数据库,将数据全读出来
谢谢各位
#7
最后一次up
#8
上面的回答已经解决了问题了啊。
将数据得到本地,构好2树,然后在onchange事件中写动作。
如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊
将数据得到本地,构好2树,然后在onchange事件中写动作。
如果要多个数据集,完全可以临时生成数据集俯相同的值就可以了塞。不需要多次读数据库啊
#9
是吗?还是不太明白,去试试先,分先发了。