C#中如何实现TreeView控件选中根结点相应的子节点也选中,同时将信息相应的显示到DataGridView控件中。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中如何实现TreeView控件选中根结点相应的子节点也选中,同时将信息相应的显示到DataGridView控件中。相关的知识,希望对你有一定的参考价值。

就是如下图,当选中一班时对应的三个节点也选上,每个节点若被选中,则将选中节点的信息显示到DataGridView中。
高分跪求源代码。。。。。

#region 将树的checkbox选中
private void setNodeTrue(Node selNode)


Node node = selNode.Parent;
if (node != null)

node.CheckState = CheckState.Checked;
setNodeTrue(node);


#endregion

#region 将树的checkbox选中
private void setNodeStateTrue(Node selNode)

if (selNode.CheckBoxVisible)

selNode.CheckState = CheckState.Checked;
foreach (Node node in selNode.Nodes)

setNodeStateTrue(node);




#endregion

#region 将树的checkbox取消选中
private void setNodeStateFalse(Node selNode)

if (selNode.CheckBoxVisible)

selNode.CheckState = CheckState.Unchecked;
foreach (Node node in selNode.Nodes)

setNodeStateFalse(node);




#endregion

#region 将树的checkbox取消选中
private void setNodeFalse(Node selNode)

Node nextNode = selNode.NextNode;
Node previousNode = selNode.PrevNode;
Node praNode = selNode.Parent;
if (praNode != null)

while (nextNode != null)

if (nextNode.Checked)

return;

nextNode = nextNode.NextNode;

while (previousNode != null)

if (previousNode.Checked)

return;

previousNode = previousNode.PrevNode;

praNode.CheckState = CheckState.Unchecked;
setNodeFalse(praNode);


#endregion

#region 单击树的checkbox事件 //这个是事件注意了
private void tvDevice_AfterCheck(object sender, AdvTreeCellEventArgs e)

Node node = tvDevice.SelectedNode;
//bool bo = node.Checked;
if (node.Checked)


setNodeTrue(node);
setNodeStateTrue(node);

else

setNodeStateFalse(node);
setNodeFalse(node);

flag = true;

#endregion
//直接复制使用 找到treeview AfterCheck事件绑定 tvDevice_AfterCheck方法就行追问

那如何实现选择相应的节点在DataGridView控件中显示相应的值呢

追答

#region getCheckBus 取得树checkbox打勾的node
private List getCheckNode()

List listNode = new List();
Node selectNode = tvDevice.SelectedNode;//选中的节点
Node root = null;
getRootNode(selectNode, ref root);
getAllNode(root, nodes);//取得选中节点的所有子节点
foreach (TreeNode node in nodes)

if (node.CheckState == CheckState.Checked)

busRows.Add(node);


return listNode;

#endregion

#region 取得根节点
private void getRootNode(Node node, ref Node rootNode)


Node parNode = node.Parent;
if (parNode != null)

getRootNode(parNode, ref rootNode);

else

rootNode = node;



#endregion

#region 取得传入节点及其所有子节点
private void getAllNode(Node node, List nodeList)

nodeList.Add(node);
if (node.Nodes.Count > 0)

foreach (Node nodeChild in node.Nodes)

getAllNode(nodeChild, nodeList);



#endregion

试试 临时写 拿到选中的节点

参考技术A 这是一些节点选中的代码:可以看看
private void SetTreeNodeText(TreeNode curNode,string empLimit)

if (empLimit.IndexOf(curNode.Text) != -1)//包含

curNode.Checked = true;

else

curNode.Checked = false;
for (int k = 0; k < curNode.Nodes.Count; k++)

SetTreeNodeCheck(curNode, false);



if (curNode.Nodes.Count > 0)

for (int i = 0; i < curNode.Nodes.Count; i++)

string text = curNode.Nodes[i].Text;

if (empLimit.IndexOf(text) != -1)

curNode.Nodes[i].Checked = true;
SetTreeNodeText(curNode.Nodes[i], empLimit);

else

SetTreeNodeText(curNode.Nodes[i], empLimit);
curNode.Nodes[i].Checked = false;
selectParentNode(curNode.Nodes[i], false);





void setParentCheck(TreeNode node, bool ischecked)

if (node.Nodes.Count > 0)

for (int i = 0; i < node.Nodes.Count; i++)

if (node.Nodes[i].Checked)

node.Nodes[i].Parent.Checked = ischecked;
setParentCheck(node.Nodes[i], ischecked);






private void SetTreeNodeCheck(TreeNode node, bool ischecked)//设置选中状态

if (node.Nodes.Count > 0)

for (int i = 0; i < node.Nodes.Count; i++)

node.Nodes[i].Checked = ischecked;
this.SetTreeNodeCheck(node.Nodes[i], ischecked);




private void selectParentNode(TreeNode node, bool check)

if (node.Parent is TreeNode)

TreeNode pnode = (TreeNode)node.Parent;
if (pnode.Checked == false)

pnode.Checked = check;

selectParentNode(pnode, check);

else

//根节点



//清空选中的节点
private void ClearSelectedNode(TreeNode curNode)

curNode.Checked = false;
if (curNode.Nodes.Count > 0)

for (int i = 0; i < curNode.Nodes.Count; i++)

string text = curNode.Nodes[i].Text;
if (curNode.Nodes[i].Checked)

curNode.Nodes[i].Checked = false;

GetSelectedNodeText(curNode.Nodes[i]);




//获取选中节点的文本
private string GetSelectedNodeText(TreeNode curNode)

if (curNode.Nodes.Count > 0)

for (int i = 0; i < curNode.Nodes.Count; i++)

string text = curNode.Nodes[i].Text;
if (curNode.Nodes[i].Checked)

limits = limits + text + "/";

GetSelectedNodeText(curNode.Nodes[i]);


return limits;


//软件设置
private void tvSoftSet_AfterCheck(object sender, TreeViewEventArgs e)

if (e.Node.Tag != null)

if (e.Node.Tag.ToString() == "0")

SetTreeNodeCheck(this.tvSoftSet.Nodes[0], e.Node.Checked);

else if (e.Node.Tag.ToString() == "1")

SetTreeNodeCheck(e.Node, e.Node.Checked);



参考技术B 需要自定义树控件。

C#动态给treeview控件添加节点和子节点

在程序运行的时候,点击一个按钮添加,主要是子节点怎么添加

如图,添加根节点可以添加,可是子节点去不知道怎么添加
我在添加子节点的时候,用鼠标单击了一个节点,我怎样才能知道是那个节点呢?怎么让程序知道该在那个里添加呢?

很简单,你的问题已经隐藏在你的疑惑的地方了
treeview 鼠标点击一个节点,那么这个节点是处于选中状态的,它会有明显的蓝色背景,而且只有一个处于选中状态
treeview.SelectNode 就是选中的节点
此为方法一
方法二:设置treeview 有一个属性,是否显示复选框,好像叫做ShowCheckBox 设置为true,你每次勾选节点前面的复选框,然后怎么判断是否选中呢?
循环所有根节点 foreach node in root.childnode
if(node.Checked)
//这个node就是你需要在下面添加子节点的节点

分清楚selected 和checked 就可以帮你解决你疑惑的地方
参考技术A TreeNode RootNode=new TreeNode();
this.treeView1.Nodes.Add(RootNode);
就这样加根节点,子节点也是同样方法。

语句: ParentNode.ChildNodes.Add(ChildNode);

其中:
ParentNode:父结点
ChildNodes:VS默认的父节点属性,用于获取父结点的第一级子节点
Add: VS默认的结点添加方法
ChildNode: 所要插入的子节点追问

我在添加子节点的时候,用鼠标单击了一个节点,我怎样才能知道是那个节点呢?

追答

其他网友已经给了你答案,我想你应该明白了O(∩_∩)O~

本回答被提问者采纳
参考技术B 用递归去实现就可以了 参考技术C 应该是控件new一个add添加

以上是关于C#中如何实现TreeView控件选中根结点相应的子节点也选中,同时将信息相应的显示到DataGridView控件中。的主要内容,如果未能解决你的问题,请参考以下文章

关于c#中treeview节点的收缩与展开(.net web)

C#动态给treeview控件添加节点和子节点

c# TreeView实现三种选中状态

C#中treeview控件中,如何使第一个节点默认选中高亮?

C#中按钮点击后,treeview控件怎么选中指定节点?

C#中如何设置treeview每个节点背景图片及背景颜色