C#中 TreeView如何获取某一节点下的所有子节点

C#中 TreeView如何获取某一节点下的所有子节点,第1张

这个好办,通过递归调用,把节点放到一个list里不就得了

namespace WindowsApplication1

{

public partial class Form1 : Form

{

private List<TreeNode> nodeList = new List<TreeNode>();

private void FetchNode(TreeNode node)

{

nodeListAdd(node);

for (int i = 0; i < nodeNodesCount; i++)

{

FetchNode(nodeNodes[i]);

}

}

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

for (int i = 0; i < thistreeView1NodesCount; i++)

{

FetchNode(thistreeView1Nodes[i]);//递归根节点的所有子节点

}

MessageBoxShow(nodeListCount + "");

}

}

}

如果你说的父节点是根结点,判断:

TreeNode node=treeView1SelectedNode;

if(nodeParent==null)

nodeExpand();

else

ToDo:响应

其实一般不会这样做。因为节点很多情况下是超出两级的。你可以利用nodeTag属性。

比如在加载的时候,把结点分类别,保存到nodeTag属性中。点击节点时,判断该属性值就可以了,当然还用其它方法,比如利用节点的Name属性。象这样:

TreeNode node=treeView1SelectedNode;

if(nodeTagToString()==“父结点”)

nodeExpand();

else

ToDo:响应

treeviewNodesClear();

string fileName = "xxxxml";

try

{

//读取XML文件

TreeNode node;

XmlReader reader = XmlReaderCreate(fileName);

while (readerRead())

{

if (readerNodeType == XmlNodeTypeElement)//元素节点

{

node = new TreeNode();

switch (readerDepth) //元素深度

{

case 0:

nodeText = readerGetAttribute("name");

treeviewNodesAdd(node);

break;

case 1:

nodeText = readerGetAttribute("name");

treeviewNodes[0]NodesAdd(node);

break;

case 2:

nodeText = readerGetAttribute("name");

treeviewNodes[0]Nodes[treeviewNodes[0]NodesCount - 1]NodesAdd(node);

break;

default: break;

}

}

}

readerClose();

treeviewExpandAll();

}

catch (Exception ex)

{

MessageBoxShow(exMessage,"错误提示");

}

一个读取xml文件的范例 你需要根据你的xml文件内容来写

1、SendMessage

向TreeView控件发送消息通常要用API的sendmessge函数,这需要在标准模块里添加声明如下:

'API声明

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, lParam As Any) AsLong

Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd AsLong, ByVal wMsg AsLong, ByVal wParam AsLong, ByVal lParam AsLong) AsLong

这上面两个声明,区别只在最后一个参数。Tiger_Zhao说,前一种是自动取地址,通常对应指针类型的参数。后一种直接传值,通常对应非指针类型的参数。通常,如果MSDN 的参数类型有,就用前一种。而后一种,实际上可以对应于下面这种调用: Call SendMessage(hTvw, TVM_EXPAND, TVE_EXPAND, ByVal hItem)。在这篇文章里有一个具体的例子。

2、获得TreeView Node对应的HItem

发消息时,常常需要提供的参数之一是TreeView Node对应的HItem。可以像下面这样获得:

PrivateFunction GetHTreeItem(ByVal nodX As MSComctlLibNode, treX As MSComctlLibTreeView) AsLong

nodXSelected =True

GetHTreeItem = SendMessage(treXhwnd, TVM_GETNEXTITEM, TVGN_CARET, 0)

End Function

不过,上面的方法中要改变treeview的当前节点。如果不希望改变当前节点的话,可以参考这篇文章里的办法:>

string[] strs = { "01", "02", "03", "0301", "0302", "04", "0401", "0402", "05", "0501", "0502" };

foreach (string str in strs) {

if (strLength == 2) {

thistreeView1NodesAdd(str, str); // key, text

}

else {

string parent = strSubstring(0, 2);

TreeNode parentNode = thistreeView1NodesFind(parent, true)[0];

parentNodeNodesAdd(str);

}

}

注意: 这种写法, 要保证添加"0301"之前已经添加好"03"节点, 你只要在添加之前对数据源排序一下就行, 或者就是在添加子节点前判断并处理一下

以上就是关于C#中 TreeView如何获取某一节点下的所有子节点全部的内容,包括:C#中 TreeView如何获取某一节点下的所有子节点、c# Treeview,如何判断双击选中的是父节点、帮我用c#写个 xml读取程序,实现将xml中的树形结构在 winform中以treeView形式显示出来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9565058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存