有关treeview添加节点的问题?
用一个Treeview来接收任意个Xml文件,以前我是用递归来实现的,但组长说递归处理大型的Xml文件会很慢,让我用虚节点方法来实现(具体方法的名字也许跟这有出处),这个方法的意思是先添加根节点,点击根节点那个“+”号后又立刻添加根节点下的子节点,再点击根节点下的子节点的那个“+”后,又添加此节点的子节点,以此反复,如果用户不点击那个“+”,按组长的意思就是不添加选中节点的子节点(表述不好,见谅!),请问这个怎么实现呢,哪位高手帮下忙,谢谢!!!
[解决办法]
先选出最顶级节点,添加到tree,这是根节点,然后点击加号时,触发BeforeExpand事件,在这里根据当前节点的内容,再去筛选xml的下一层节点,然后添加到当前节点的下级
[解决办法]
/// <summary> /// 添加目录树节点的展开事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tvDir_BeforeExpand(object sender, TreeViewCancelEventArgs e) { this.GetSubTreeNodes(e.Node); } /// <summary> /// 获取指定节点下的次两级子节点 /// </summary> /// <param name="currNode">指定的节点信息</param> private void GetSubTreeNodes(TreeNode currNode) { DataSet ds = new DataSet(); foreach (TreeNode tmpNode in currNode.Nodes) { if (tmpNode.Nodes.Count == 0) { ModelOperation.ElementList eleListMode = (ModelOperation.ElementList)tmpNode.Tag; if (!eleListMode.IsElement) // true: 是会后一级 { ds = eleListDAL.GetElementListByUpList(eleListMode.ListId, ListType); if ((null != ds) && (ds.Tables.Count > 0)) { DataTable tmpTab = ds.Tables[0]; foreach (DataRow row in tmpTab.Rows) { TreeNode node = new TreeNode(row["listname"].ToString()); ModelOperation.ElementList subeleListMode = this.CreateElementListObj(row); // 创建目录信息的实体对象 node.Tag = subeleListMode; tmpNode.Nodes.Add(node); } } } } }
[解决办法]
在几点展开的时候去加载该节点下的数据
//展开节点前
private void tvReport_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
//如果节点下的没有子节点,返回
if (e.Node.Nodes.Count == 0)
return;
for (int i = 0; i < e.Node.Nodes.Count; i++)
{
//如果是已经加载过的返回
if (e.Node.Nodes[i].Nodes.Count != 0)
{
break;
}
//加载节点下的子节点的子节点
TB_BG bgList = (e.Node.Nodes[i].Tag as TB_BG);
List<TB_BG> currentList = bgManage.GetModelList(" BG_FLXH=" + bgList.BG_XH);
AddNode(e.Node.Nodes[i], false);
}
}