我在網上找到了TreeView顯示Chekbox的代碼
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100); 現在想對TreeView1的沒有個樹節點進行一些控制:
1、子節點與其父節點勾選的狀態一致;
2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
3、保存樹的節點狀態.最好寫成一個公用類,方便調用。在網上找了很久,都沒有滿意的例子。
我相信有人已經解決了以上問題,在很多論壇裡,很多人都說很容易,但是就是不肯寫出具體的例程。現在隻有開貼求答了!
請高手們不吝賜教!謝謝!
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100); 現在想對TreeView1的沒有個樹節點進行一些控制:
1、子節點與其父節點勾選的狀態一致;
2、其中一個子節點取消勾選,其父節點也取消勾選,其他子節點不受影響;
3、保存樹的節點狀態.最好寫成一個公用類,方便調用。在網上找了很久,都沒有滿意的例子。
我相信有人已經解決了以上問題,在很多論壇裡,很多人都說很容易,但是就是不肯寫出具體的例程。現在隻有開貼求答了!
請高手們不吝賜教!謝謝!
解决方案 »
- 100分 紧急求助,生成PDF格式文件,特殊字符显示为“?”,请高手指点
- SetWindowsHookEx监视全局窗口创建消息的问题
- 开放源码的 CnPack IDE 专家包发布 0.9.0 版 !
- 请问如何显示文件夹,或者用什么控件,或使用TreeView时用什么算法
- 帮忙找问题。。
- VarAsType
- 请慎重考虑:关于封Google检索引擎
- 我在主窗口里调用一个子窗口,目的是想在主窗口点击时能调用这个子窗口。但不知为什么每次运行时进入的都是子窗口。
- 路过的千万别错过了,好东西啊,windows消息的说明(很多很多),不看可惜了啊
- 关于在delphi中做sqlsever库备份的问题!
- TSQLConnection组件的ConnectionName属性设置的问题
- 急,FastReport 中richtext内容显示不全?只有特定的字号能显示
你可以参考一下
http://topic.csdn.net/u/20080703/17/e6cbf9be-dccf-448b-bb4c-a41ca1c48eae.html
这个,树节点的信息结构....
to yangkunjie :
就是说父节点要影响所有其子节点,任何一个子节点取消时影响父节点,
子节点之间不相互影响。to hongqi162:
已经在补充的时候说了:不使用任何的第三方控件
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;
可以通过for i := Item.Index-1 downto 0 do反向查找父节点,再
CheckSubItems,代码不写了。
3、保存樹的節點狀態.
不知道你要保存到哪,TreeView本来就有Chekbox和Checked状态。
你可以不用第三方控件,但是你可以参考里面的代码啊,你可以下载一下看看里面的源码是怎么实现的,下面是这个控件的父子节点互动的例子。
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;