//我这里有一个关于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;
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;
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;
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;