c# treeview的checkd属性用法,怎样实现当我父节点没打勾的时候,子节点不能选(不能打勾)?求高手帮忙····
解决方案 »
- vs制作安装包,如何加入依赖项?
- inkcanvas 的画线跟文字混写的问题
- c# winform 点击按钮后移动panel
- XtraNavBar控件,如何点击后,得到相应group的序号或caption名称?
- Sharepoint 开发的两个问题
- 怎样手工修改dataset中的datatable?急!
- 如何给数据库中表添加新列,而不改变已有的数据
- 怎么判断一个字符串是否是数字字符串?多谢
- 求winform||控制台为服务端 webform||webservice为客户端 进行socket异步通信的例子
- 求教如何去除字符串内未闭合引号?急!
- 关于大整数的转换
- 怪需求啊,在PPT全屏模式的时候,在ppt右侧放上自己的工具条,能做吗?
private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Parent != null && e.Node.Parent.Checked == false)
{
e.Cancel = true;
}
}
功能:如果某一节点被选中,选中该节点的所有子节点并展开,自动折叠其他同级节点。如果某一节点被去掉选中,去掉选中该节点的所有子节点并展开,自动折叠其他同级节点。如果该节点是其父节点的最后一个选中节点,且被去掉选中,去掉选中其父节点,折叠父节点。
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);
}
实现以下功能:当用户单击节点选择框时,程序自动将该节点的所有子节点的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);
}