我有两个表(ADO+ACCESS)表1:func
id cd fcd
1 中国 0
1001 河北 1
1002 河南 1
1002001 郑州 1002
1002002 洛阳 1002
2 美国 0
2001 纽约 2
2002 华盛顿 2表2:qx
user id
123 1
123 1001
123 1002
123 1002001
123 1002002
123 2
123 2001
456 1
456 1001
456 1002
456 2
456 2001我想把func表中的所有数据放入treeview中,然后把qx中的user=123的过滤出来,以两个表的ID为条件,如果ID相同,treeview中对应的节点的图标为“√”(图标索引为0),如果不同,节点的图标为“X”(图标索引为1),请教代码怎么写。
id cd fcd
1 中国 0
1001 河北 1
1002 河南 1
1002001 郑州 1002
1002002 洛阳 1002
2 美国 0
2001 纽约 2
2002 华盛顿 2表2:qx
user id
123 1
123 1001
123 1002
123 1002001
123 1002002
123 2
123 2001
456 1
456 1001
456 1002
456 2
456 2001我想把func表中的所有数据放入treeview中,然后把qx中的user=123的过滤出来,以两个表的ID为条件,如果ID相同,treeview中对应的节点的图标为“√”(图标索引为0),如果不同,节点的图标为“X”(图标索引为1),请教代码怎么写。
SCODEFORMAT = '133'; //代码结构:根据你自己的结构 再定吧
....// 以下函数将代码库中的内容调入树结构控件
// crtbl 是 选定的 树型数据部件
Function loadcode(crtbl:tADOQUERY;Ltvwcode:Ttreeview):integer;
var NowID,Showtxt:string;
Level:integer;
MyNode:array[0..5] of TtreeNode;
//保存各级节点,最长支持6级(本系统)begin
Screen.Cursor :=crHourGlass;
Level:=0;
with crTbl do
begin
try
if not active then open;
First;
Ltvwcode.Items.clear;
//以下是增加第一项;
MyNode[Level]:=Ltvwcode.items.add(LtvWcode.topitem,sFirstNodeTxt);
Mynode[Level].ImageIndex:=0;
MYnode[Level].selectedindex:=0;
//以上是增加第一项;
while not eof do
begin
NowID:=TRIM(FieldbYNAME('typeID').ASSTRING);
// ShowTxt:=NowID+'_'+FIELDBYNAME('typeNAME').AsString;
ShowTxt:=FIELDBYNAME('typeNAME').AsString;
Level:=GetLevel(SCodeFormat,NowID);
//返回代码的级数
//以下是增加子项
//以下用上一级节点为父节点添加子节点
IF Level>0 then //确保代码符合标准
begin
MyNode[level]:=Ltvwcode.items.addChild(MyNode[Level-1],ShowTXT);
Mynode[level].ImageIndex :=1;
Mynode[level].SelectedIndex:=2;
end;
//以上是增加子项
next;
end;
except
close;
end;
end;
MyNODE[0].Expand(false);//将首节点展开
Screen.cursor:=crDefault;
RESULT:=1;
end;Function getlevel(sFormat,sCode:string):integer;
VAR I,Level,iLEN:iNTEGER;
BEGIN
LEVEL:=-1; //如果代码不符合标准,则返回-1
iLEN:=0;
IF (sFORMAT<>'') AND (SCODE<>'') THEN
FOR I:=1 TO LENGTH(SFORMAT) DO
BEGIN
iLEN:=iLEN+StrtoINT(sFORMAT[I]);
IF LENGTH(SCODE)=ILEN THEN
BEGIN
LEVEL:=I;
BREAK;
END;
END;
RESULT:=LEVEL;
END; //上面函数的功能是返回一代码的级数
1、count,节点个数。
2、item[index] ,通过index得到节点。二、针对TTreeNodes,也就是 TreeView.Items,常用的添加节点的操作有:
AddFirst添加第一个根节点。由此函数添加的节点总排在前面,除非后来又使用此函数添加了一个节点,则后添加的节点将排在前面。该函数返回新添加的节点。
AddChildFirst添加第一个子节点,要求有父节点作为其参数。返回新添加的节点。
AddChild添加一个子节点,要求有父节点作为其参数。返回新添加的节点。
Add添加一个兄弟节点,要求有兄弟节点作为其参数。返回新添加的节点。三、针对TTreeNodes,也就是 TreeView.Items,常用的得到节点的操作有:
GetFirstNode() 得到根节点。
然后配合TTreeNode.GetNext(),就可以访问所有的节点。四、建树举例:var
root_node,cur_node:TTreeNode;
begin
root_node:=AddFirst(nil,'根节点1');
cur_node:=addChildfirst(root_node,nil,'根节点1_child1');
add(cur_node,'根节点1_child2');
root_node:=Add(nil,'根节点2');
AddChildFirst(root_node,''根节点2_child1');
end;
五、事件触发:
当从一个节点跳到另一个节点,会触发TTreeView.OnChange事件。该事件中,将传递node,即当前被选中的节点。当修改一个节点的text时,会触发TTreeView.onEdit事件。
六、将节点和节点所对应的数据联系起来
对于每个TTreeNode,有个Data属性,可以存放一个指针。我们可以利用这个域来存放与节点对应的自己的数据。
1.我们先定义一个数据结构,作为记录我们要记录的数据。如:
type
PMyData=^TMyData;
TMyData=Record
sFName:string;
sLName:String;
nIndex:integer;
end;2.然后,创建数时,将节点和节点数据联系起来:
procedure TForm1.Button1Click(Sender: TObject);
var
myshuju: PMyData
cur_node:TTreeNode;
begin
New(MyRecPtr); //记住,一定要先分配内存。有几个节点,就要分配几次内存。
myshuju^.FName:=Edit1.Text;
Myshuju^.LName := Edit2.Text;
TreeViewIndex := StrToInt(Edit3.Text);
with TreeView1 do
begin
cur_node:=items.AddFirst(nil,'first');
cur_node.data:=myshuju;
end;
end;3.当我们选中一个节点时,就可以使用我们的数据了。
procedure TForm1.TreeView1Change(Sender:TObject;Node:TTreeNode);
begin
if node.data<>nil then
self.label1.caption:=pmyData(node.data)^.Fname+pmyData(node.data)^.Lname
end;
七、一般使用流程:
1、添加全局变量:
b_first:boolean; //记录是否是第一次访问节点,因为此时数据还未准备好,而一旦访问节点就会触发OnChange事件,在此事件处理函数中也许会出错。
2、在FormCreate中,
a、设置b_first:=true;
b. 创建数并将节点与数据联系。
3、在FormShow中
设置b_first:=false;
4.在事件OnChange中处理节点被选中事件。
5.在Edit中处理节点被修改Text事件。
并调用OnChange.
6.在 TreeView.Destory中
释放Data 中指向的内存空间。
create table #func(id int, cd varchar(10), fcd int)
create table #qx([user] int, id int)insert #func select 1, '中国', 0
union all select 1001, '河北', 1
union all select 1002, '河南', 1
union all select 1002001, '郑州', 1002
union all select 1002002, '洛阳', 1002
union all select 2, '美国', 0
union all select 2001, '纽约', 2
union all select 2002, '华盛顿', 2
insert #qx select 123, 1
union all select 123, 1001
union all select 123, 1002
union all select 123, 1002001
union all select 123, 1002002
union all select 123, 2
union all select 123, 2001
union all select 456, 1
union all select 456, 1001
union all select 456, 1002
union all select 456, 2
union all select 456, 2001
/*生成测试数据结束*//*开始查询*/
select t1.id, t1.cd,
case when (t2.id is null) then '×' else '√' end as '#qx是否有user=123的相同id记录'
from #func t1
left join #qx t2
on t2.[user] = 123 and t2.id = t1.id
/*查询结束*/--清除测试数据
drop table #func, #qx/*查询结果
id cd #qx是否有user=123的相同id记录
----------- ---------- ---------------------
1 中国 √
1001 河北 √
1002 河南 √
1002001 郑州 √
1002002 洛阳 √
2 美国 √
2001 纽约 √
2002 华盛顿 ×
*/
case when (t2.id is null) then '×' else '√' end as '#qx是否有user=123的相同id记录'
from #func t1
left join #qx t2
on t2.[user] = 123 and t2.id = t1.id在运行时出错。
改成
iif (isnull(t2.id), '×', '√')既然你使用access,你就应该熟悉一下access的语法,像iif这种应该是access比较常用的基本语法