关于Ttreeview的一点凝问?(200分)

  • 主题发起人 主题发起人 sundart
  • 开始时间 开始时间
S

sundart

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大师:
小弟做一程序时使用了Ttreeview,其作用是用来筛选数据库的记录;
form左边是Ttreeview,右面是Tdbgrid,通过对Ttreeview的选择,来筛选相应的记录。
客户要求:通过在Tdbgrid中选择记录,则对应的Ttreeview节点也能自动选择(作一标记)。
(即能通过节点来筛选数据记录,也能通过记录标记相应节点)
不知我说清楚没有?
请各位大师点化!
 
如果通过选择treeview筛选了dbgrid的记录,那么再在dbgrid里面点击记录,
对应的应该还是刚才的那个node,无法通过“记录标记相应节点”呀?
想法有问题把?
 
左边是Ttreeview,右面是Tdbgrid,通过对Ttreeview的选择,来筛选相应的记录。这
个我曾经做过,无非是放个Query,动态查询罢了,也可用Table,使用Filter(但这
样没有Query方便。
TTreeview有事件可用,大概是OnClick,或也可能是其他的,在这个事件中判断选中
了哪个节点,再动态查询。
第二个我也没怎么看懂,是不是象“资源管理器”那样,在右边双击文件夹(相当于
不是最低层次的节点),文件夹会自动打开?因为若是文件(相当于最低层次的节
点)的话就不会再展开了,左边也不会变。如果是这样的话,道理与上面一样,
TDbGrid中有相应的事件可以用,在事件处理函数中再重新查询,这时候,左边
的TreeView要更新了,更新后可用它的方法,设定当前选中的接点,并展开。
好好看看帮助。
 
这问题有点难理解, 不知ningliu的理解对不对, 请提问者解释一下.
 
简单了,使用TDBTreeView控件,类似的数据敏感控件挺多的
做个MASTER-DETAIL,DETAIL为QUERY,MASTER LINK TDBTREEVIEW
当DETAIL选中时,修改相应MASTER TREEVIEW的IMAGE INDEX
不就行了吗?
 
你们没看明白,这个问题本身就有毛病:

如果可以通过treeview来过滤右边的dbgrid,那么每个treeview一定对应
一个唯一的键。
当通过treeview过滤数据后,dbgrid显示的只是符合该treenode对应的键
的数据。
那么,无论在dbgrid里面怎样选择,始终对应的还是这个键,不可能又使
左边的 treeview发生变化 ---- 因为过滤的键没有(也不可能)变化。

打个比方,在“资源管理器”里面,通过treeview选择一个目录后,右边的
listview显示的是该目录下的文件,那么,在listview里面无论怎样选择,
也无法选到另外一个目录(另一个treenode)里面去。
 
看明白了. 不考虑题目情况. 如果要知道如何在treeview中通过一个字符串定位到特定node上,
可以用个循环:
for i := 0 to treeview1.items.count-1 do
if treeview1.items.item.text = '特定字符串' then
begin
treeview1.selected := treeview1.items.item;
break;
end;
 
各位大师:
对不起,具体是这样的:
比如做一个人员管理。Ttreeview的items为:

人员管理
民航系统(有子节点)
政府机关(有子节点)
......
(Ttreeviw中的数据存储在Table中,通过编码实现层次关系)
其中“人员管理”为第一层。选中他时将列出所有记录。在实际输入人员信息时
没有严格要求输入,有的记录对应了Ttreeview节点, 有的没对应,这样在筛选时
就不能完全选出。这就需要列出全部记录作调整,每选中一人员记录就需要在
Ttreeview中标记出对应的节点,如果没对应就调整。
所有找到对应节点相当重要。
我想通过节点的imageindex实现这一功能,当我移动记录时,确是也作了标记,但使用一会儿它就会出现错误,是“无效的索引”,数据库绝对有主关键字,有索引。
(小弟我打字速度很慢,想尽量节约语句,没想到......,实在抱歉)




 
还是没看大懂。我觉得你的设计思路有问题:

如果需求里面要求按关键字(类别)索引/查询,那么每个记录都应该有这个
关键字段,怎么能“有的有,有的没有”呢?

况且,你想过没有?你点击treeview时发生了onchange事件,在这个事件里
你进行筛选记录,然后如果在通过点击dbgrid来变换treeview的选择,那么就会
立即发生treeview的onchange事件,而这个事件又会立即触发数据重新进行筛选,
dbgrid的内容马上发生变化,你不觉得这样的结果很奇怪吗?

建议:

每个人员都要有自己的分类的key,没有分类就用key=-1;

根节点:"人员管理"对应 key = -1; 表示没有具体分类的人员;
"民航系统":key = 0;
"政府机关": key = 1;
子节点:key = 101; 或 key=3 并且ParentKey=1 (总之与1有对应关系)
....
这样当:
点击根节点“人员管理”时,当前key=-1;
在dbgrid中列出所有 key=-1 的人员(没有分类的人员)

点击“民航系统”,当前key=0;
在dbgrid中列出所有 key=0 的人员(民航系统人员)
......

至于如何在treeview的节点中保存自己key的值,可以用treenode.data属性,
我猜你用什么imageindex就是为了这个吧?

这样处理是不是要清晰多了?
 
我的理解是这样的:
你的人员管理是不是有一个主关键字(比如说身份证号),但这个主关键字不能表示
这个人的身份,所以说一定有另外的字段来区分每个人所属的单位,你提的问题就在
于不是每个人的这个标识身份的字段都有数据,要做的就是如果有数据,就在左边的
Treeview中选定相应的节点,否则就不选择,对不对。注意这里有个问题:只有在你
所谓的最顶节点被选中(从而右边对应的记录是全体的)的情况下,没有标识数据的
记录才会显示出来,否则选中下层的节点,右边只显示符合条件的记录了。所以说,
你的右边选中记录,左边自动选中节点的功能只有在右边查询条件是“所有”时才算
有用。
我提供几点意见:
1)如何保存关键字;我想你的数据库中记录的关键字不会是“姓名”或“名称”之类
的,即“民航系统”你可能用一个编号来表示,但创建Treeview时,不可能显示这些
编号,用node的data属性的话不便于查询等好多操作,我曾经的处理办法是:在创建
一个treeview,设为不可见的,其节点是用编号来表示,与显示给用户的对应,用户
对显示的treeview的操作你可如法炮制也让不可见的treeview作相应操作。而在数据
表上的操作先反馈到不可见的treeview上,在程序处理让可见的treeview做响应的操
作。这就容易对应了。
2)如果节点包括最低层次的数据,这里是人事记录,那么你在改变人事记录中人员的
所属后,必须重新创建treeview内的节点,因为等于是节点移动了。如果不包含,则
不用重建。
3)cAKK说的也是个问题,解决这个问题,就不能选用这些事件,比如可以改选
OnClick事件,判断有没有节点被选中,有选中的才做处理。



 
就用我上面的根据字符串查找treeview的节点的方法不就行了?
在你的table.afterscroll中查找treeview节点.
 
其实这还是有办法解决的。
譬如人员有ID,并且Unique或Null
1 TTreeView的OnChange,由当前node作TQuery/TTable+Filter
2 TDBGrid的OnClick
TreeView1.OnChange:=nil;
if 当前人员的ID若为空 then
TTreeView置当前node为根
else
否则找出他所在项目;
TreeView1.OnChange:=TreeView1Change;


 
可以这样:
1. 定义全局变量var isFilter boolean;
onformload时 isfilter:=true;
2. 在treeview1ONCHANGE中增加:
if isfilter then
begin
.....filter....
end;
3. 在dbgridonclick中增加
isfilter:=false;
.....查找NODE, 用EYES的方法就行...
isfilter:=true;

 
感谢大家,接受答案!
 
呵呵, 分呢:-)
 
多人接受答案了。
 
后退
顶部