C# 遍历当前选中节点的子节点

C# 遍历当前选中节点的子节点,第1张

遍历的父节点。具体代码 protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

PopulateTreeView();

}

}

//从数据库中获得数据并创建第一级treeview items

private void PopulateTreeView()

{

DataTable treeViewData = getTreeViewDate();

AddTopTreeViewNodes(treeViewData);

}

//使用dataAdapter he dataTable 处理数据库数据

private DataTable getTreeViewDate()

{

return ProductTypeManagergetAll();

}

//过滤数据 获得parentid为null的项

private void AddTopTreeViewNodes(DataTable treeViewDate)

{

DataView view = new DataView(treeViewDate);

viewRowFilter = "ParentId is null";

foreach (DataRowView row in view)

{

TreeNode newNode = new TreeNode(row["typeName"]ToString(), row["id"]ToString());

tvTypeNodesAdd(newNode);

AddChildTreeViewNodes(treeViewDate, newNode);

}

}

//添加子项

private void AddChildTreeViewNodes(DataTable treeVIewData, TreeNode parentTreeViewNode)

{

DataView view = new DataView(treeVIewData);

viewRowFilter = "parentid=" + parentTreeViewNodeValue;

foreach (DataRowView row in view)

{

TreeNode newNode = new TreeNode(row["typeName"]ToString(), row["id"]ToString());

parentTreeViewNodeChildNodesAdd(newNode);

AddChildTreeViewNodes(treeVIewData, newNode);

}

}

递归

你这只是所选节点的一级子节点,一级节点的子节点要用递归去找

void getNode(TreeNode treeNode)

{

foreach(TreeNode node in selectnodeNodes)

{

thisgetNode(node);

}

}

大概就是这样

这个要根据你的TreeView上的节点是怎么添加上去的。

如果你是自己一个一个创建TreeNode添加上去的话

那就通过TreeViewNodes属性来遍历所有节点。

如果你是绑定值的话,那就取TreeView的DataSource。

总之就是你往TreeView上是怎么添加的,就怎么取。

$fnzTreeinit($("#treeDemo"), setting, zNodes);

zTree = $fnzTreegetZTreeObj("treeDemo");

var nodes=zTreegetNodes();

var nodes_array = zTreetransformToArray (nodes);

for(var i=0;i<nodes_arraylength;i++){

alert(nodes_array[i]name);

}

//下面是api,自己不会看么,zTreeObjgetNodes是所有节点数据都在里面,自己不会取,就不要瞎叫唤,自己可以用火狐看里面的数据是不是都有

zTreeObjgetNodes

概述[ 依赖 jqueryztreecore 核心 js ]

获取 zTree 的全部节点数据

请通过 zTree 对象执行此方法。

Function 参数说明

返回值Array(JSON)

全部节点数据

1、Array 仅仅是根节点的集合(默认情况子节点都处于 children 属性下);

2、如需遍历全部节点需要利用递归,或利用 transformToArray 方法 将数据变成简单的 Array 集合

3、对于异步加载模式下,尚未加载的子节点是无法通过此方法获取的。

function 举例

1 获取全部节点数据

var treeObj = $fnzTreegetZTreeObj("tree");

var nodes = treeObjgetNodes();

ML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini。VC++里 *** 作XML有两个库可以用:MSXML和XmlLite。MSXML又细分了两种接口:DOM和SAX2。XP没自带有XmlLite,只自带有2x、3x版的MSXML,不支持SAX2(需要MSXML 40以上),所以优先使用DOM。

DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:

1、MFC里用CComPtr调用

2、SDK里直接调用DOM接口

3、SDK里用智能指针调用

这3种方法本质上是一样的,区别只不过在于需要编码的多少而已,用CComPtr可以极大的简化代码,下面是几个例子。

例子stocksxml:

<xml version="10" encoding="utf-8">

<root>

<node1>text1</node1>

<node2>

<childnode1 attrib1="value1" attrib2="value2"/>

<childnode2 attrib1="value1" attrib2="value2">childtext1</childnode2>

</node2>

</root>

这个例子应该包含了XML最常见的特征了吧?

MFC

MFC里可以直接使用DOM,不需要手动添加额外的头文件,只需要在CWinApp::InitInstance()里调用CoInitialize(NULL)初始化COM,在CWinApp::ExitInstance里调用CoUninitialize()释放COM就行了。

//读取XML

CComPtr<IXMLDOMDocument> spDoc; //DOM

spDocCoCreateInstance(CLSID_DOMDocument);

VARIANT_BOOL vb;

spDoc->load(CComVariant(OLESTR("stocksxml")), &vb); //加载XML文件

CComPtr<IXMLDOMElement> spRootEle;

spDoc->get_documentElement(&spRootEle); //根节点

CComPtr<IXMLDOMNodeList> spNodeList;

spRootEle->get_childNodes(&spNodeList); //子节点列表

long nLen;

spNodeList->get_length(&nLen); //子节点数

for (long i = 0; i != nLen; ++i) //遍历子节点

{

CComPtr<IXMLDOMNode> spNode;

spNodeList->get_item(i, &spNode);

ProcessNode(spNode); //节点处理函数

}

//写入XML

CComPtr<IXMLDOMNode> spNode;

spRootEle->selectSingleNode(OLESTR("/root/node1"), &spNode);

spNode->put_text(OLESTR("newText")); //写入text

spRootEle->selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"), &spNode);

spNode->put_nodeValue(CComVariant(OLESTR("newValue"))); //写入value

CComPtr<IXMLDOMNode> spNewNode;

spDoc->createNode(CComVariant(NODE_ELEMENT), OLESTR("childnode3"), OLESTR(""), &spNewNode); //创建新节点

spRootEle->selectSingleNode(OLESTR("/root/node2"), &spNode);

spNode->appendChild(spNewNode, &spNewNode); //将新节点加为node2的子节点

spNewNode->put_text(OLESTR("childtext2")); //写入新节点text

CComQIPtr<IXMLDOMElement> spEle = spNewNode; //注意这里使用CComQIPtr

spEle->setAttribute(OLESTR("attrib1"), CComVariant(OLESTR("value1")));//给新节点添加属性

spDoc->save(CComVariant(OLESTR("stocksxml")));

//节点处理函数

void ProcessNode(CComPtr<IXMLDOMNode>& spNode)

{

CComBSTR bsNodeName;

spNode->get_nodeName(&bsNodeName); //节点名

AfxMessageBox(COLE2CT(bsNodeName));

CComVariant varVal;

spNode->get_nodeValue(&varVal); //节点值

AfxMessageBox(COLE2CT(varValbstrVal));

DOMNodeType eNodeType;

spNode->get_nodeType(&eNodeType);

if (eNodeType == NODE_ELEMENT) //只有NODE_ELEMENT类型才能包含有属性和子节点

{

//递归遍历节点属性

CComPtr<IXMLDOMNamedNodeMap> spNameNodeMap;

spNode->get_attributes(&spNameNodeMap);

long nLength;

spNameNodeMap->get_length(&nLength);

for (long i = 0; i != nLength; ++i)

{

CComPtr<IXMLDOMNode> spNodeAttrib; //注意属性也是一个IXMLDOMNode

spNameNodeMap->get_item(i, &spNodeAttrib);

ProcessNode(spNodeAttrib);

}

//递归遍历子节点

CComPtr<IXMLDOMNodeList> spNodeList;

spNode->get_childNodes(&spNodeList);

spNodeList->get_length(&nLength);

for (long i = 0; i != nLength; ++i)

{

CComPtr<IXMLDOMNode> spChildNode;

spNodeList->get_item(i, &spChildNode);

ProcessNode(spChildNode);

}

}

}

对于<tag>text</tag>这样的节点,get_nodeValue会得到空,要得到"text"的话可以遍历子节点(只有一个子节点,它的nodeName为"#text",nodeType为NODE_TEXT,nodeValue就是"text");也可以用get_text直接得到"text",但是对于这样的节点<tag>text<childtag>childtext</childtag></tag>,get_text会同时得到"text"和"childtext",不过这样的节点应该是不允许的。

DOM里使用的字符串(BSTR)都是OLESTR类型,默认情况下OLESTR是Unicode字符,MFC里可以用COLE2CT把LPCOLESTR转换为LPCTSTR。

对于自己定义的XML,大多数时候不需要遍历,可以通过调用selectNodes、selectSingleNode指定XPath直接读取某个节点或属性:

CComPtr<IXMLDOMDocument> spDoc; //DOM

spDocCoCreateInstance(CLSID_DOMDocument);

VARIANT_BOOL vb;

spDoc->load(CComVariant(OLESTR("stocksxml")), &vb); //加载XML文件

CComPtr<IXMLDOMElement> spRootEle;

spDoc->get_documentElement(&spRootEle); //根节点

CComPtr<IXMLDOMNodeList> spNodeList;

CComPtr<IXMLDOMNode> spNode;

spRootEle->selectNodes(OLESTR("/root/node2/"), &spNodeList); //得到node2下的所有子节点

spRootEle->selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"), &spNode); //得到childnode1的attrib1属性

XPath的语法可以参考XML文档或MSDN。

SDK

SDK中也可以使用智能指针,和MFC没太大区别,同样很方便,直接给代码:

#include <iostream>

#include <tcharh>

#import <msxml3dll>

//节点处理函数

void ProcessNode(MSXML2::IXMLDOMNodePtr spNode)

{

std::cout << "nodeName: " << spNode->nodeName;

if (spNode->nodeType == NODE_ATTRIBUTE || spNode->nodeType == NODE_TEXT)

std::cout << "\tnodeValue: " << _bstr_t(spNode->nodeValue);

std::cout << std::endl;

if (spNode->nodeType == NODE_ELEMENT)

{

MSXML2::IXMLDOMNamedNodeMapPtr spNameNodeMap = spNode->attributes;

for (long i = 0; i != spNameNodeMap->length; ++i) //遍历节点属性

ProcessNode(spNameNodeMap->item);

MSXML2::IXMLDOMNodeListPtr spNodeList = spNode->childNodes;

for (long i = 0; i != spNodeList->length; ++i) //遍历子节点

ProcessNode(spNodeList->item);

}

}

int _tmain(int argc, _TCHAR argv[])

{

CoInitialize(NULL);

//读取XML

MSXML2::IXMLDOMDocumentPtr spXMLDoc;

spXMLDocCreateInstance(__uuidof(MSXML2::DOMDocument30));

spXMLDoc->load(L"stocksxml");

MSXML2::IXMLDOMElementPtr spRoot = spXMLDoc->documentElement; //根节点

MSXML2::IXMLDOMNodeListPtr spNodeList = spRoot->childNodes;

for (long i = 0; i != spNodeList->length; ++i) //遍历子节点

ProcessNode(spNodeList->item);

//写入XML

spRoot->selectSingleNode(L"/root/node1")->text = L"newText";

spRoot->selectSingleNode(L"/root/node2/childnode1/@attrib1")->nodeValue = L"newValue";

MSXML2::IXMLDOMNodePtr spNewNode = spRoot->selectSingleNode(L"/root/node2")->appendChild(

spXMLDoc->createNode(_variant_t(NODE_ELEMENT), L"childnode3", L"")

); //给node2创建新子节点childnode3

spNewNode->text = L"childtext2";

MSXML2::IXMLDOMElementPtr spEle = spNewNode;

spEle->setAttribute(L"attrib1", _variant_t(L"value1")); //添加新属性

spXMLDoc->save(_variant_t(L"stocksxml"));

spNewNodeRelease();

spEleRelease();

spNodeListRelease();

spRootRelease();

spXMLDocRelease();

CoUninitialize();

system("pause");

return 0;

}

要用递归的方法才行,首先构建一个带有treeview1和button1的基本窗体,在treeview1中添加一些节点,保持默认的名字即可。程序将搜寻节点带有j"节点1"的节点,包括节点10,节点11,然后按照你的要求添加新节点。代码如下:

Public Class Form1

Dim a() As String = {"节点1", "a(1)节点"}

Dim mnodes As New ArrayList

Dim cnodes As TreeNode

Private Sub Button1_Click(ByVal sender As SystemObject, ByVal e As SystemEventArgs) Handles Button1Click

get_n(TreeView1Nodes)

For Each ntxt As TreeNode In mnodes

If ntxtTextIndexOf(a(0)) >= 0 Then

ntxtNodesAdd(New TreeNode(a(1)))

Else

ntxtNodesAdd(New TreeNode("新节点"))

End If

Next

End Sub

Private Sub get_n(ByVal cn As TreeNodeCollection)

For Each ma As TreeNode In cn

If maNodesCount > 0 Then

mnodesAdd(ma)

cnodes = ma

get_n(cnodesNodes)

Else

mnodesAdd(ma)

End If

Next

End Sub

End Class

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<script src=">

以上就是关于C# 遍历当前选中节点的子节点全部的内容,包括:C# 遍历当前选中节点的子节点、C# 遍历节点、1楼 在asp.net 中如何通过代码获取Treeview控件节点的的Value值,网上资料虽然一大把,但就是没有能成功的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10173878.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存