请问:现在我把数据库的数据写入treeview了,但我在增加一个节点的时候这样来判断该节点在数据库中的位置!(在treeview中显示的是名称,在数据库中名称是

  • 主题发起人 主题发起人 gsl814
  • 开始时间 开始时间
G

gsl814

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:现在我把数据库的数据写入treeview了,但我在增加一个节点的时候这样来判断该节点在数据库中的位置!(在treeview中显示的是名称,在数据库中名称是有可能重复的,级别是唯一的,现在的问题是我在TREEVIEW选中名称时怎样在数据库中找出相应的唯一的级别字段,在次提示名称在数据库中部唯一)(200分)<br />[:D]
 
当然是看它在TreeView中是第几级了,它的父是什么

还有,如果要详细回答,请给出库结构
 
把数据库中唯一标志写入treeview中
 
可以用一个stringlist保存相应的代码,而TreeView显示名称,这样一一对应可以了
 
type//可以先定义一个,记录类型
Treeifor = ^TMyRec;
TMyRec = record
ID : string;
Name : string;
Tag : Integer;
end;
在实现的时候有两种方法,
1:
var
temp:TtreeNode;
WZInfo:Treeifor;
begin
New(WZInfo);
WZInfo^.ID:=table.FieldValues['Idfields']
WZInfo^.Name:=table.FieldValues['Namefields']
WZInfo^.Tag:=namber;
//第一种方法
temp:=TreeView.Items.AddChildObject(TreeNode//是已知的结点,WZInfo^.Name,WZInfo);
//第二种方法
你可以使用普通的方法创建节点(TreeNode),创建后给TreeNode的Data
属性赋值也可以,aNode.Data := WZInfo;但我很少用这种方法.
调用的时候:
Id:=Treeifor(TreeNode.Data)^.ID
后面的事你知道该怎么办了吧,


 
如果用指针的话,释放有些麻烦:)
 
TreeView.Items.AddObject 方法添加一个结构体(record)
 
大哥:用record 和point的方法把数据库的纪录写入treeview我知道现在是这样的
a---
-bb 结构图是这样的,treeview中显示的都是name字段,name字段不唯一
-cc 如在2纪3纪都有bb,数据库中id是唯一,
-dd-bb 现在的问题是:
我在选中treeview的2纪bb时,怎样取出他在数据库中唯一的id字段



 
你在TreeView上维护的是视图,你必须单独维护一份文档,而且用TreeNode的data对应起来。
至于释放指针你都嫌麻烦,那就真是…………
当然你还可以让你的TreeNode的Text这样显示:“结点Name(结点ID)”这样就没有问题了
 
lyjgs.168 的方法是最好,最标准的


 
以下使用指针的方式把数据的名称写到treeview中。现在是当我选择treeview的名称时(名称在数据库布唯一)
时怎样找出名称对应的级别(数据库中是唯一的)
在 TreeView1Click事件中怎样写?具体点好吗?给我个例子[8D]

procedure Tbumen_set_frm.viewtree1;
var
i:integer;
temnode:ttreenode;
ins,ss,kk:string;
tmp:string ;
begin
ins:='';
ins:=ins+ ' select * from 部门表 ' ;
ADOQuery1.close;
ADOQuery1.SQL.Clear ;
ADOQuery1.sql.add(ins);
adoquery1.open;
while not adoquery1.eof do
begin
ss:= adoquery1.fieldbyname('级别').AsString;
kk:=ADOQuery1.fieldbyname('father').AsString ;
if ADOQuery1.FieldByName('father').AsString ='' then
begin
TreeView1.Items.AddObject(nil,adoquery1.FieldByName('名称').AsString,pchar(adoquery1.fieldbyname('级别').AsString));
end else
begin

with TreeView1 do
begin
for i := 0 to Items.Count-1 do
begin
tmp:=pchar(items.date) ; /取出 ADOQuery1.FieldByName('级别').AsString;
if (tmp = kk )then
begin

items.AddChildObject(Items,ADOQuery1.FieldByName('名称').AsString,pchar(ADOQuery1.FieldByName('级别').AsString));
break;
end; // if
end; // for
end; // with treeview1
end;
adoquery1.next;
end;
end;
 
本来想把下面这些代码写在你给出的过程里,但我认为你的树是一个递归树,
用你原来的写法不太好,因为你添加两层可以,但如果是三层,四层呢,
所以就没有写进去,还是给你说详细一点你自己处理吧,

Treeifor = ^TMyRec;
TMyRec = record
ID : string;//id号
Name : string;//名称
JB:String;//级别
Tag : Integer;
end;//把这段代码写在你要写代码的类里,公有,私有随你便,
如果还想加其它的值的话也可以在end;前面加上你所想加的值就可以了,


var WZInfo:Treeifor;//把这段代码写在过程定义变量的地方,


New(WZInfo);
WZInfo^.ID:=table.FieldValues[记录ID号];
WZInfo^.Jb:=table.FieldValues['级别'];
WZInfo^.Name:=table.FieldValues['名称'];
TreeView1.Items.AddObject(nil,WZInfo^.Name,WZInfo);//这段代码是添加结点的时候要用到的,

当点击树的结点的时候取相应的值
//取出级别:Treeifor(TreeView1.Selected.TreeNode.Data)^.JB
//取出记录ID:Treeifor(TreeView1.Selected.Data)^.ID
现在可以取出ID来了,那么后面的事就不难了吧,

下面是我写的释放函数:写的可能不好
function funFreeTreeViewNodeData(aNode: TTreeNode): integer;
begin
Result := -1;
if Assigned(aNode.Data) then
begin
try
Dispose(Treeifor(aNode.Data));
aNode.Data := nil;
except
on E: Exception do
Application.MessageBox(PChar(E.Message),
'释放树型节点指针(Data)时发生错误', 0);
end;
end;
Result := 1;
end;
 
我觉得释放node上的指针可以这样
当生成新指针的时候,不仅把它赋值给node.data属性,而且把它加入一个List
这样就不用递归这棵树了,直接遍历List释放指针
 
遍历这颗树根本不用递归只用Treeview.items就可以了
另外使用一个List多余
 
Treeview.items可以吗?你回去试一试就知道了.
 
不需要指针,可以用继承类来实现,只要在类中增加一个属性,用来记录数据库记录的ID(必须是唯一关键字)就可以实现了。
{$R *.dfm}

type
TMyNode = class (TTreeNode)
private
FExtraCode: Integer;
protected
procedure SetExtraCode(const Value: Integer); virtual;
function GetExtraCode: Integer; virtual;
public
property ExtraCode: Integer read GetExtraCode write SetExtraCode;
end;

{ TMyNode }

function TMyNode.GetExtraCode: Integer;
begin
Result := FExtraCode;
end;

procedure TMyNode.SetExtraCode(const Value: Integer);
begin
FExtraCode := Value;
end;

...

CurrentNodeClass := TMyNode; //改变 类
MyNode:=Treeview1.Items.AddChild(Node1,varText) as TMyNode;
MyNode.ExtraCode:=varID;
MyNode.ImageIndex:=0;
MyNode.Selected;
CurrentNodeClass := TTreeNode; //改变 类
Treeview1.Selected:=MyNode as TTreeNode;
...
 
将id字段附加在bb上,如bb(id),用id时在将它取出。
 
补充一下:我的那个方法的来源:
这个技术用类来实现是比较合适的,可以参考《Mastreing Delphi 6》Sybex出版,中文版是《Delphi 6 从入门到精通》,该书获得Borland大奖。
采用类的方法还可以实现一个Treeview和多个表之间的户动,包括可以拖放移动多表的记录,是效率较高的办法。
 
后退
顶部