c# treeview的checkd属性用法,怎样实现当我父节点没打勾的时候,子节点不能选中?求高手帮忙····

liunanxuan613 2012-03-31 04:06:40
c# treeview的checkd属性用法,怎样实现当我父节点没打勾的时候,子节点不能选(不能打勾)?求高手帮忙····
...全文
330 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小志 2012-04-01
  • 打赏
  • 举报
回复
当用户单击TreeView节点选择框时,程序自动将该节点的所有子节点的Check设置成该节点的状态.
实现以下功能:当用户单击节点选择框时,程序自动将该节点的所有子节点的Check设置成该节点的状态.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace TreeViewCheck
{
/// <summary>
/// 树节点上下文Checked属性控制
/// </summary>
public static class TreeViewCheck
{
/// <summary>
/// 系列节点 Checked 属性控制
/// </summary>
/// <param name="e"></param>
public static void CheckControl(TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node != null)
{
CheckParentNode(e.Node, e.Node.Checked);
}
if (e.Node.Nodes.Count > 0)
{
CheckAllChildNodes(e.Node, e.Node.Checked);
}
}
}
#region 私有方法
//改变所有子节点的状态
private static void CheckAllChildNodes(TreeNode pn, bool IsChecked)
{
foreach (TreeNode tn in pn.Nodes)
{
tn.Checked = IsChecked;
if (tn.Nodes.Count > 0)
{
CheckAllChildNodes(tn, IsChecked);
}
}
}
//改变父节点的选中状态
private static void CheckParentNode(TreeNode curNode, bool IsChecked)
{
bool bChecked = true;
if (curNode.Parent != null)
{
foreach (TreeNode node in curNode.Parent.Nodes)
{
if (node.Checked == false)
{
bChecked = false;
break;
}
}
if (bChecked)
{
curNode.Parent.Checked = true;
CheckParentNode(curNode.Parent, true);
}
else
{
curNode.Parent.Checked = false;
CheckParentNode(curNode.Parent, false);
}
}
}
#endregion
}
}
//示例代码
private void tv_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeViewCheck.CheckControl(e);
}
小志 2012-04-01
  • 打赏
  • 举报
回复
级联父子节点的复选框状态
功能:如果某一节点被选中,选中该节点的所有子节点并展开,自动折叠其他同级节点。如果某一节点被去掉选中,去掉选中该节点的所有子节点并展开,自动折叠其他同级节点。如果该节点是其父节点的最后一个选中节点,且被去掉选中,去掉选中其父节点,折叠父节点。
private void tree_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{

TreeView tree = (TreeView) sender;
tree.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(this.tree_AfterCheck);

//折叠其他同级节点
TreeNode parentNode = e.Node.Parent;
if (parentNode != null)
{
foreach (TreeNode tn in parentNode.Nodes)
{
if (tn != e.Node)
tn.Collapse();
}
}
else
{
foreach (TreeNode tn in tree.Nodes)
{
if ( tn != e.Node)
tn.Collapse();
}
}

//标记该节点的所有子节点的选中状态与该节点一致
foreach (TreeNode tn in e.Node.Nodes)
tn.Checked = e.Node.Checked;

//if (e.Node.Checked)
e.Node.ExpandAll(); //如果该节点为选中,展开该节点
//else
// e.Node.Toggle(); //如果该节点没有选中:如果该节点处于折叠状态,则展开该节点,否则折叠它

//如果当前节点的父节点下的所有子节点都没有选中,去掉父节点的选中
if (e.Node.Checked == false && e.Node.Parent != null)
{
bool found = false; //父节点的子节点中至少有一个节点被选中,则found = true
foreach (TreeNode tn in e.Node.Parent.Nodes)
{
if (tn.Checked == true)
{
found = true;
break;
}
}
if ( found == false) //没有找到任何被选中的子节点
{
e.Node.Parent.Checked = false;
e.Node.Parent.Collapse();
}
}

tree.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.tree_AfterCheck);
}
江湖小哥 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C# code

private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Parent != null && e.Node.Parent.Checked == false)
{……
[/Quote]

学习
bdmh 2012-03-31
  • 打赏
  • 举报
回复

private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Parent != null && e.Node.Parent.Checked == false)
{
e.Cancel = true;
}
}

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧