我在網上找到了TreeView顯示Chekbox的代碼
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100); 現在想對TreeView1的沒有個樹節點進行一些控制:
1、子節點與其父節點勾選的狀態一致;
2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
3、保存樹的節點狀態.最好寫成一個公用類,方便調用。在網上找了很久,都沒有滿意的例子。
我相信有人已經解決了以上問題,在很多論壇裡,很多人都說很容易,但是就是不肯寫出具體的例程。現在隻有開貼求答了!
請高手們不吝賜教!謝謝!

解决方案 »

  1.   

    1stclass里面有个fctreeview,这个组件直接带checkboxhttp://gzu.3322.org/list.asp?id=880
      

  2.   

    个人觉得,关键是为每个树节点保存信息,主要是对信息进行修改,再判断....
    你可以参考一下
    http://topic.csdn.net/u/20080703/17/e6cbf9be-dccf-448b-bb4c-a41ca1c48eae.html
    这个,树节点的信息结构....
      

  3.   

    谢谢楼上几位的回帖。我已经说得很明白了。
    to yangkunjie :
    就是说父节点要影响所有其子节点,任何一个子节点取消时影响父节点,
    子节点之间不相互影响。to hongqi162:
    已经在补充的时候说了:不使用任何的第三方控件
      

  4.   

    是不复杂,只需要额外加点标记就行。我是用ListView1.Items[].Data保存级别,你自己看着办吧。//将Item自身的Checked状态应用到下级子项目
    procedure CheckSubItems(Item: TListItem);
    var
        i: Integer;
    begin
        for i := Item.Index+1 to ListView1.Items.Count-1 do
            if Integer(ListView1.Items[i].Data) > integer(Item.Data) then
                ListView1.Items[i].Checked := Item.Checked
            else
                Break;
    end;
      

  5.   

    2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
    可以通过for i := Item.Index-1 downto 0 do反向查找父节点,再
    CheckSubItems,代码不写了。
    3、保存樹的節點狀態. 
    不知道你要保存到哪,TreeView本来就有Chekbox和Checked状态。
      

  6.   


    你可以不用第三方控件,但是你可以参考里面的代码啊,你可以下载一下看看里面的源码是怎么实现的,下面是这个控件的父子节点互动的例子。
    procedure TFormMain.tvToggleCheckbox(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    var CurNode, ParentNode, GrandSonNode: TfcTreeNode;
      flg1: boolean;
    begin
      inherited;
      if Node.CheckboxType<>tvctCheckbox then Exit;
      with TreeView do begin
        if Node.Checked then //判断父是否为灰
        begin
          ParentNode:= Node.Parent; //父;
          if ParentNode<>nil then
          begin
            GrandSonNode := ParentNode.GetFirstChild; //遍历子树;
            flg1 := false;
            while GrandSonNode<>nil do
            begin
              if (not GrandSonNode.Checked) or (GrandSonNode.Grayed) then //true,有未选中
                flg1 := true;
              if flg1 then //已有、退出loop;
                GrandSonNode := nil
              else
                GrandSonNode := GrandSonNode.GetNextSibling;
            end;
            if flg1 then
              ParentNode.Grayed := true
            else
              ParentNode.Grayed := false;
            ParentNode.Checked := true; //return;
          end;
        end;
        if Node.checked and (not Node.Grayed) then //选中/不灰,子全选
        begin
          CurNode := Node.GetFirstChild; //子全选;
          while CurNode<>nil do
          begin
            CurNode.Checked := true; //return;
            CurNode := CurNode.GetNextSibling;
          end;
        end;
        if not Node.Checked then //未选中
        begin
          CurNode := Node.GetFirstChild;
          while CurNode<>nil do
          begin
            CurNode.Checked := false;
            CurNode := CurNode.GetNextSibling;
          end;
        end;
        if not Node.Checked then //判断父是否为灰
        begin
          ParentNode := Node.Parent; //父;
          if ParentNode<>nil then
          begin
            GrandSonNode := ParentNode.GetFirstChild; //遍历子树;
            flg1 := false;
            while GrandSonNode<>nil do
            begin
              if (GrandSonNode.Checked) or (GrandSonNode.Grayed) then //true,有选中
                flg1 := true;
              if flg1 then //已有、退出loop;
                GrandSonNode := nil
              else
                GrandSonNode := GrandSonNode.GetNextSibling;
            end;
            if flg1 then
            begin
              ParentNode.Grayed := true;
              ParentNode.Checked := true; //return;
            end
            else
            begin
              ParentNode.Grayed := false;
              ParentNode.Checked := false; //return;
            end;
          end;
        end;
      end;
    end;
      

  7.   

    如果复杂一些的话,可以下载一个:http://www.2ccc.com/article.asp?articleid=4247http://bbs.yd153.com