小弟在线跪求关于TcxTreeList如何在各节点前显示CheckBox问题。
然后还有就是Check一个父节点的时候,下边的所有子节点也自动Check如何处理。
在线跪求!急!急!急!急!急!急!

解决方案 »

  1.   

    //我这里有一个关于fcTreeView的你说的那个我没有用过,原理应该差不多
    procedure TFormPowerMgr.fcTreeView1ToggleCheckbox(
      TreeView: TfcCustomTreeView; Node: TfcTreeNode);
    var CurNode, ParentNode, GrandSonNode: TfcTreeNode;
      flg1: boolean;
    begin
      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;
      

  2.   

    procedure TForm1.BindCxTreeList(lst: TcxTreeList; ANode: TcxTreeListNode;
      CurrentID: Integer);
    var
      TmpNode: TcxTreeListNode;
      ASQL: string;
      Qry: TADOQuery;
      I: Integer;
    begin
      if lst = nil then
        Exit;
      Qry := TADOQuery.Create(Self);
      Qry.EnableBCD := False;
      try
        ASQL := 'select * from SysMenus_Right where PID = ' + IntToStr(CurrentID);
        ExecuteSql(Qry, ASQL, False, True);
        if Qry.IsEmpty then
          Exit;
        TmpNode := ANode;
        Qry.First;
        for I := 0 to Qry.RecordCount - 1 do
        begin
          if CurrentID = 0 then
          begin
            ANode := lst.AddNode(nil, nil, nil, tlamAddChildFirst);
            ANode.Values[0] := Qry.FieldByName('Cname').AsString;
            ANode.Values[1] := Qry.FieldByName('CID').AsInteger;
            ANode.CheckGroupType := ncgCheckGroup;
            ANode.Checked := True;
          end
          else
          begin
            ANode := lst.AddNode(nil, TmpNode, nil, tlamAddChild);
            ANode.Values[0] := Qry.FieldByName('Cname').AsString;
            ANode.Values[1] := Qry.FieldByName('CID').AsInteger;
            ANode.CheckGroupType := ncgCheckGroup;
            ANode.Checked := True;
          end;
          BindCxTreeList(lst, ANode, Qry.FieldByName('CID').AsInteger);
          Qry.Next;
        end;
      except
        on E: Exception do
        begin
          MessageBox(0, PChar(Format('%s', [E.Message + ASQL])), '提示',
            MB_OK + MB_ICONWARNING);
        end;
      end;
      Qry.Free;
    end;