本例子实现以下几个功能
1.递归xml绑定到treeview控件,并且显示。
2.递归寻找treeview中哪些checkbox被选中
3.递归获取选中checkbox的值,并且存入容器中,并且显示出来
代码例子要用的xml结构
<?xml version="1.0" encoding="utf-8" ?>
<Company Cname="慧能芯图">
<部门1>
<张三></张三>
<小明></小明>
</部门1>
<部门2>
<李四></李四>
<王五></王五>
</部门2>
<部门3>
<李刚></李刚>
<赵宇></赵宇>
</部门3>
<部门4>
<李哄></李哄>
<赵天></赵天>
</部门4>
</Company>
页面部分截图
功能一实现:
private void btn_GetInfo_Click(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\xml递归\xmlOperate\xmlOperate\Information.xml");
BindXml(doc);
}
#region 绑定信息
private void BindXml(XmlDocument doc)
{
//取得根节点Company
XmlNode root = doc.SelectSingleNode("Company");
string name = root.Attributes["Cname"].Value.ToString();//获取属性值
TreeNode treeroot = new TreeNode(name);
trvshow.Nodes.Add(treeroot); //添加根节点
BindTreeView(root, treeroot); //递归调用,绑定到treeview控件上
// trvshow.ExpandAll(); //是否全部展开
}
private void BindTreeView(XmlNode node,TreeNode tn)
{
foreach(XmlNode xn in node.ChildNodes)
{
TreeNode childnode = new TreeNode(xn.Name.ToString());
childnode.Name = xn.Name.ToString();
if(xn.ChildNodes.Count==0) //最底层节点,无孩子节点
{
childnode.Text = xn.Name.ToString();//这个地方根据不同的xml稍微改动,是取InnerText还是Name
}
tn.Nodes.Add(childnode);
if (xn.ChildNodes.Count > 0) //如果有子孩子继续递归遍历
{
BindTreeView(xn, childnode);
}
}
}
#endregion
功能二实现:
private void trvshow_AfterCheck(object sender, TreeViewEventArgs e)
{
if(e.Action!=TreeViewAction.Unknown)
{
/*
* 因为每个节点复选框的状态改变后都会引发 AfterCheck 事件,
* 我们为了避免无限次地进入递归中,就需要判断TreeViewAction的状态,
* 所有被我们使用代码自动选中的节点的TreeViewAction 状态为 Unknown,
* 因为可以避免我们调用递归过程的时候出问题。
*/
CheckAllChildBox(e.Node, e.Node.Checked);
#region 当所有子节点选中,使父节点选中
bool bolChecked = true;
//当所有子节点选中时,父节点勾选
if(e.Node.Parent!=null)
{
for (int i = 0; i < e.Node.Parent.Nodes.Count;i++)
{
if(e.Node.Parent.Nodes[i].Checked==false)
{
bolChecked = false;
}
}
e.Node.Parent.Checked = bolChecked;
}
#endregion
}
}
#region 检查所有的checkbox是否选中
private void CheckAllChildBox(TreeNode treeNode, bool IsCheck)
{
foreach(TreeNode tn in treeNode.Nodes)
{
tn.Checked = IsCheck;
if(tn.Nodes.Count>0)
{
CheckAllChildBox(tn, tn.Checked);
}
}
}
#endregion
功能三实现:
List<TreeNode> selectNodes = new List<TreeNode>();
private void btn_GetCheckInfo_Click(object sender, EventArgs e)
{
if(selectNodes.Count!=0)
{
TreeNodeCollection tnodes = trvshow.Nodes; //获取treeview的子节点的集合
GetSelectedTreeNode(tnodes, selectNodes); //递归调用获取选中的node节点存入selectNodes
ShowSelectNodesInfo(selectNodes);//显示selectNodes中的信息
}
}
private void ShowSelectNodesInfo(List<TreeNode> selectNodes)
{
StringBuilder sb = new StringBuilder();
foreach(TreeNode tn in selectNodes)
{
sb.Append(tn.Name.ToString());
sb.Append(",");
}
string c = sb.ToString().Substring(0, sb.Length - 1);
MessageBox.Show(c.ToString());
}
private void GetSelectedTreeNode(TreeNodeCollection tnodes, List<TreeNode> selectNodes)
{
foreach(TreeNode node in tnodes)
{
if(node.Checked)
{
selectNodes.Add(node);
}
GetSelectedTreeNode(node.Nodes, selectNodes);
}
}
程序运营图:
功能1
功能2:
功能3: