5,388
社区成员
发帖
与我相关
我的任务
分享
你可以不用第三方控件,但是你可以参考里面的代码啊,你可以下载一下看看里面的源码是怎么实现的,下面是这个控件的父子节点互动的例子。
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;
//将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;