|
功能:当点击父节点的checkbox则子节点的checkbox也跟随变化
public partial class TreeViewAndCheckbox : Form
{
public TreeViewAndCheckbox()
{
InitializeComponent();
//treeview显示checkbox
treeView1.CheckBoxes = true;
this.treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);
TreeNode parentNode = new TreeNode("测试父节点");
treeView1.Nodes.Add(parentNode);
TreeNode tmpNode01 = new TreeNode("子节点1");
parentNode.Nodes.Add(tmpNode01);
TreeNode tmpNode02 = new TreeNode("子节点2");
parentNode.Nodes.Add(tmpNode02);
TreeNode tmpNode03 = new TreeNode("子节点3");
parentNode.Nodes.Add(tmpNode03);
TreeNode tmpNode04 = new TreeNode("子节点4");
parentNode.Nodes.Add(tmpNode04);
}
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.ByMouse)
{
if (e.Node.Checked)
{
//取消节点选中状态之后,取消所有父节点的选中状态
setChildNodeCheckedState(e.Node, true);
}
else
{
//取消节点选中状态之后,取消所有父节点的选中状态
setChildNodeCheckedState(e.Node, false);
//如果节点存在父节点,取消父节点的选中状态
if (e.Node.Parent != null)
{
setParentNodeCheckedState(e.Node, false);
}
}
}
}
//取消节点选中状态之后,取消所有父节点的选中状态
private void setParentNodeCheckedState(TreeNode currNode, bool state)
{
TreeNode parentNode = currNode.Parent;
parentNode.Checked = state;
if (currNode.Parent.Parent != null)
{
setParentNodeCheckedState(currNode.Parent, state);
}
}
//选中节点之后,选中节点的所有子节点
private void setChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
setChildNodeCheckedState(tn, state);
}
}
}
网上找答案,说是windows6.x下面的bug,但是没有找到解决方案,求解? |
|
|
20分
#1 |
先说下你的VS环境,NET版本
|
|
20分
#2 |
写在nodeclick里呢
|
|
20分
#3 |
点击过快,子节点 选中就跟不上?
-》
void tvLeft_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
CheckAllChildNodes(e.Node, e.Node.Checked);
//选中父节点
bool bol = true;
if (e.Node.Parent != null)
{
for (int i = 0; i < e.Node.Parent.Nodes.Count; i++)
{
if (!e.Node.Parent.Nodes[i].Checked)
bol = false;
}
e.Node.Parent.Checked = bol;
}
}
}
#region 选中子节点
public void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
foreach (TreeNode node in treeNode.Nodes)
{
node.Checked = nodeChecked;
if (node.Nodes.Count > 0)
{
this.CheckAllChildNodes(node, nodeChecked);
}
}
}
#endregion
|
|
20分
#5 |
没有体会的人是不能理解的。
|
|
20分
#6 |
解决方法:1.弱化此功能的作用。
|
|
#7 |
回复3楼: 不是方法的问题,好像环境的问题?我百度查找,说是windows6.x下面的bug。我用的是VS2012,.NET framework4.5 |
|
#8 |
已解决:解决方案如下 :
public class MyTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
// Suppress WM_LBUTTONDBLCLK
if (m.Msg == 0x203) { m.Result = IntPtr.Zero; }
else base.WndProc(ref m);
}
}
|