DBTREEVIEW的节点全选,全不选问题

Description of your first forum.

DBTREEVIEW的节点全选,全不选问题

帖子阿虫 » 星期一, 2005年8月8日 08:32


大家好,我现在做的一个小程序中,用到树状结构,所以我使用了DBTREEVEIW这个控件,
用了一个IMAGELIST,存放了两张图片,双击DBTREEVIEW(DBTREEVEIW的ONDBCLICK)时改变图片表示选中与不选.我现在想解决这样一个问题,当双击一个父节点后,改变它的选中状态后,它下面的子节点和子节点下的节点都要发生变化,和父节点的选中状态一致.
我是这样做的:
procedure checkallchild(tnode:ttreenode);
var i:integer;
begin
       for i:=0 to tnode.Count-1 do
               begin
                       tnode.Item[i].ImageIndex  :=1;
                       checkallchild(tnode.Item[i]);
               end;
procedure uncheckallchild(tnode:ttreenode);
var i:integer;
begin
       for i:=0 to tnode.Count-1 do
               begin
                       tnode.Item[i].ImageIndex  :=0;
                       uncheckallchild(tnode.Item[i]);
               end;
end;
procedure TForm1.TDBTREEVIEW1Change(Sender: TObject; Node: TTreeNode);
var i:integer;
begin

    begin
            for i:=0 to node.Count -1 do
        begin
          if  DBTREEVIEW1.Selected.ImageIndex=0 then
            begin
            node.Item[i].ImageIndex:=0;
            checkallchild(node.Item[i]);
            end
            else
          if DBTREEVIEW1.Selected.ImageIndex=1 then
            begin
           node.Item[i].ImageIndex:=1 ;
           uncheckallchild(node.Item[i]);
            end;

        end;
     end;
end;

通过上面这种写法后我发现,有时单击父根图片也变化,而且当父根是选中状态时,下面的子根必须有至少有有个也是选中,双击父根下面的子根状态才会和父根的一致,否则不变化.而且子根下的子根状态并不变化.不知大家有什么好的方法解决这个问题,对了,我的数据是和数据库相连的,其中存有IMAGELIST的图片索引号.
 
 
 

DBTREEVIEW的节点全选,全不选问题

帖子crazycock » 星期一, 2005年8月8日 08:43


不要在OnChange里面写这段代码,把那段代码独立出来作为一个自定义函数。
然后在OnDBClick的时候,先让node:=DBTreeview1.Selected;然后执行你这个自定义函数。
因为你在OnChange里面写有代码,在你做其他操作,例如单击等,都会触发这个OnChange事件中的代码执行的。所以单击也会变化。
 
 
 

DBTREEVIEW的节点全选,全不选问题

帖子zjan521 » 星期一, 2005年8月8日 09:08


1.需要注意.如果你的ImageList和DB当中相关联的话.那么问题就复杂一些.(不过你的DBTree应该会自动更新DataSet中的内容)
2.另一点.tnode.Item[i].ImageIndex  :=1这个是否会触发子节点tnode的新的TDBTREEVIEW1Change事件?(我这里没有环境,不能确定.)如果可以触发.那么
procedure checkallchild(tnode:ttreenode);
var i:integer;
begin        for i:=0 to tnode.Count-1 do                begin
                       tnode.Item[i].ImageIndex  :=1;
                       //checkallchild(tnode.Item[i]);//可以省略掉了.
               end;
end;
3.这种问题需要调试跟踪.因此只能你发现在什么情况下肯定出问题,然后调试跟踪.如果你自己不能跟踪.那么1.你应该增强自己的基础能力2.如果需要别人帮助,那么在提出问题的时候,就应该把你的示例代码/组件/ACCESS等小型数据库打包,使别人能够调试.而且这个事例代码应该是你经过抽象的.可以直接或者很简单的配置,比如安装DBTree之后就可以编译通过的
 
 
 

DBTREEVIEW的节点全选,全不选问题

帖子阿虫 » 星期二, 2005年8月9日 10:15


谢谢两位了,一试一下,这里先给加上分,呵呵.