现有Ta,Tb,Tc三个表,三个DBGird,一个TreeView, 1.DBGird_A使用Ta,根据DBGird_A里的列生成TreeView的根节点,
2.DBGird_B使用Tb,根据DBGird_B里的列递归生成TreeView的同级子节点。这两个问题已经解决。 3.DBGird_C使用Ta,Tb,Tc,能在展开TreeView的同时显示所有组合查询的情况下显示所有记录, 现在的关键问题是,如何在点击TreeView各子节点的时候,生成相应的DBGird_C行, 比如:点击了TreeView的子节点“房费”,生成查询到的消费类别=房费的相应记录,
点击了TreeView的子节点“餐费”,生成查询到的消费类别=餐费的相应记录!
谁能给给个代码示例啊!
2.DBGird_B使用Tb,根据DBGird_B里的列递归生成TreeView的同级子节点。这两个问题已经解决。 3.DBGird_C使用Ta,Tb,Tc,能在展开TreeView的同时显示所有组合查询的情况下显示所有记录, 现在的关键问题是,如何在点击TreeView各子节点的时候,生成相应的DBGird_C行, 比如:点击了TreeView的子节点“房费”,生成查询到的消费类别=房费的相应记录,
点击了TreeView的子节点“餐费”,生成查询到的消费类别=餐费的相应记录!
谁能给给个代码示例啊!
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.text := 'select * from table1 where name='+node.text;
for i := 0 to adoquery1.count-1 do
begin
Treeview1.items.addchild(Node,adoquery1.count[i].astring);
end;
end;
1.限度去第一级的记录,然后逐条添加到treeview中,并且为每个node的data属性保存每条记录的id
2.数据集select所有非顶级的记录,然后循环数据集,根据每条记录的上级id,去treevie上循环节点找节点的data值符合条件的node,然后添加childnode,依次类推
在点击TreeView时写入你想要的sql,
procedure TreeView1Click(Sender: TObject);
var
str: string;
begin
try
case TreeView1.Selected.Level of
1:
begin
str := 'select * from Tc where name='''+TreeView1.Selected.Text+'''';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(str);
Query1.Open;
DBGird_C.DataSource.DataSet := Query1;
end;
2:
begin
your sql;
end;
end;
except end;
end;
A表的列生成了,TreeView的根节点名称,
B表的列生成了,TreeView的各子节点名称, 这两点已经实现了。
现在待实现的是:
TreeView的各子节点名称=C表的列的时候,清除DBGIRD里面原来的记录,显示当前符合条件的记录。
TreeView的各子节点名称不同,显示的记录也就不同了。各位高手能理解吗?这个流程怎么来走才科学。根据子节点的名称显示的记录可能有几行,也可能有几百行,存TreeView.node.Data里面,不科学吧?
a
b
c
d
e
PCH_DM.dst_BranchesMgt.FieldByName('BranchesShortName').AsString;
tv_MdseMgt_Parent:=
tv_MdseMgt.Items.AddChild(Nil,tv_MdseMgt_ParentName); // 添加根节点
tv_MdseMgt_Parent.ImageIndex:=0; // 对根节点的图片样式进行设定
tv_MdseMgt_Parent.SelectedIndex:= 1;
子节点:PCH_DM.qry_MdseCategory.Refresh;
PCH_DM.qry_MdseCategory.Close;
PCH_DM.qry_MdseCategory.SQL.Clear;
PCH_DM.qry_MdseCategory.SQL.Add('select ID,MdseCategoryName, IsDiscount from MdseCategory');
PCH_DM.qry_MdseCategory.Open;
with PCH_DM.qry_MdseCategory do
begin
if not PCH_DM.qry_MdseCategory.Active then
PCH_DM.qry_MdseCategory.Active:=True;for Add_ChildCount:=0 to PCH_DM.qry_MdseCategory.RecordCount-1 do
begin
ItemNode_Name:=PCH_DM.qry_MdseCategory.FieldByName('MdseCategoryName').AsString;
ItemNode:=tv_MdseMgt.Items.AddChild(tv_MdseMgt_Parent,ItemNode_Name); // 添加子节点
ItemNode.ImageIndex:=1; // 对子节点的图片样式进行设定
ItemNode.SelectedIndex:=2+NodeIndex;
inc(NodeIndex);
PCH_DM.qry_MdseCategory.Next;end;
end;
关联的是节点的名称,取自表B的列,现在是判断树的节点名称等于组合查询语句里面的列时,在DBGIRD显示符合条件的记录。应该怎么来引用呢?
qry_MdseMgt.FieldByName('MdseCategoryName').AsString=''的时候,再往上点,原先能出来的记录也没有,非要点回所有商品才出来。没办法只有再判断一次MdseCategoryName为空的情形,并重写查询语句,怪了。这样一做反而可以了。 但是感觉代码好长,有没有办法精简下啊!完整代码:
1.form on show的时候动态生成树,并初始化DBGIRD默认显示所有记录:procedure Tfrm_DI_MdseMgt.FormShow(Sender: TObject);
var tv_MdseMgt_ParentName:String;
Add_ChildCount:Integer;
tv_MdseMgt_Parent:TtreeNode;
ItemNode,ItemNode_AllMdseCategory:TtreeNode;
ItemNode_Name:String;
NodeIndex:Integer;begin
if PCH_DM.dst_BranchesMgt.Active=False then PCH_DM.dst_BranchesMgt.Active:=True;
with PCH_DM.dst_BranchesMgt do
begin
tv_MdseMgt_ParentName:=PCH_DM.dst_BranchesMgt.FieldByName('BranchesShortName').AsString;
tv_MdseMgt_Parent:=tv_MdseMgt.Items.AddChild(Nil,tv_MdseMgt_ParentName); // 添加根节点
tv_MdseMgt_Parent.ImageIndex:=0; // 对根节点的图片样式进行设定
tv_MdseMgt_Parent.SelectedIndex:= 0;
end; NodeIndex:=0;
with PCH_DM.qry_MdseCategory do
begin
PCH_DM.qry_MdseCategory.Close;
PCH_DM.qry_MdseCategory.SQL.Clear;
PCH_DM.qry_MdseCategory.SQL.Add('select ID,MdseCategoryName, IsDiscount from MdseCategory');
PCH_DM.qry_MdseCategory.Open;
for Add_ChildCount:=0 to PCH_DM.qry_MdseCategory.RecordCount-1 do
begin
ItemNode_Name:=PCH_DM.qry_MdseCategory.FieldByName('MdseCategoryName').AsString;
ItemNode:=tv_MdseMgt.Items.AddChild(tv_MdseMgt_Parent,ItemNode_Name); // 添加子节点
ItemNode.ImageIndex:=1; // 对子节点的图片样式进行设定
ItemNode.SelectedIndex:=2+NodeIndex;
inc(NodeIndex);
PCH_DM.qry_MdseCategory.Next;
end;
end; ItemNode_AllMdseCategory:=tv_MdseMgt.Items.AddChild(tv_MdseMgt_Parent,'所有商品');
ItemNode_AllMdseCategory.ImageIndex:=1;
ItemNode_AllMdseCategory.SelectedIndex:=1; tv_MdseMgt.FullExpand; if tv_MdseMgt_Parent.Text<>'' then
begin
with PCH_DM.qry_MdseMgt do
begin
PCH_DM.qry_MdseMgt.Close;
PCH_DM.qry_MdseMgt.SQL.Clear;
PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID');
PCH_DM.qry_MdseMgt.Open;
end;
end;
end;
2.在TreeView on Change的时候判断子节点名称与记录集里面的名称是否对应,对应则显示相应记录:procedure Tfrm_DI_MdseMgt.tv_MdseMgtChange(Sender: TObject;
Node: TTreeNode);
var tv_node_Index:Integer;begin
if tv_MdseMgt.Selected.SelectedIndex>0 then
begin
for tv_node_Index:=0 to tv_MdseMgt.Items.Count-1 do
begin
if tv_MdseMgt.Selected.Text='所有商品' then
begin
with PCH_DM.qry_MdseMgt do
begin
PCH_DM.qry_MdseMgt.Close;
PCH_DM.qry_MdseMgt.SQL.Clear;
PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID');
PCH_DM.qry_MdseMgt.Open;
end;
end
else if trim(tv_MdseMgt.Items.Item[tv_node_Index].Text)=trim(PCH_DM.qry_MdseMgt.FieldByName('MdseCategoryName').AsString) then
begin
with PCH_DM.qry_MdseMgt do
begin
PCH_DM.qry_MdseMgt.Close;
PCH_DM.qry_MdseMgt.SQL.Clear;
PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID and MdseCategory.MdseCategoryName=:dbgrdh_MdseMgt_DispRec');
PCH_DM.qry_MdseMgt.Parameters.ParamByName('dbgrdh_MdseMgt_DispRec').Value:=tv_MdseMgt.Selected.Text;
PCH_DM.qry_MdseMgt.Open;
PCH_DM.qry_MdseCategory.Next;
end;
end
else if PCH_DM.qry_MdseMgt.FieldByName('MdseCategoryName').AsString='' then
begin
with PCH_DM.qry_MdseMgt do
begin
PCH_DM.qry_MdseMgt.Close;
PCH_DM.qry_MdseMgt.SQL.Clear;
PCH_DM.qry_MdseMgt.SQL.Add('select MdseMgt.ID,BranchesMgt.BranchesShortName,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseCategory.MdseCategoryName,MdseMgt.MdseEncoding,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.MdseName,MdseMgt.IsSelected,MdseMgt.FirstSpell,');
PCH_DM.qry_MdseMgt.SQL.Add('MdseMgt.Price,MdseMgt.Discount,MdseMgt.MemPrice,MdseMgt.ServeTime'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('from BranchesMgt,MdseCategory,MdseMgt'+' ');
PCH_DM.qry_MdseMgt.SQL.Add('where MdseCategory.ID=MdseMgt.MdseCategoryID and MdseCategory.MdseCategoryName=:dbgrdh_MdseMgt_DispRec');
PCH_DM.qry_MdseMgt.Parameters.ParamByName('dbgrdh_MdseMgt_DispRec').Value:=tv_MdseMgt.Selected.Text;
PCH_DM.qry_MdseMgt.Open;
PCH_DM.qry_MdseCategory.Next;
end;
end;
end;
end;
end;
测试都对了,但请各位高手看看还可以优化下代码吗?
无需安装客户端——不需要工具栏或额外下载
支持文本元素例如 INPUT 和 TEXTAREA,和可编辑 HTML 元素例如 DIV
跨越浏览器——支持 IE 和 Mozilla
用户可扩展字典——用自己的词汇表自定义字典内容
Ajax 风格组件——无需刷新页面就自动更新
作为一个客户端 JavaScript 对象或服务端控件来实现
包含集成的 HTML 编辑器
鉴别潜在错误,提供可选拼写
多语言支持——包括美国英语、法语、德语、西班牙语、意大利语、伊比利亚葡萄牙语和巴西葡萄牙语
完全可配置DbNetSpell 是不是这个?