日期:2014-05-18  浏览次数:20738 次

有关treeview添加节点的问题?
用一个Treeview来接收任意个Xml文件,以前我是用递归来实现的,但组长说递归处理大型的Xml文件会很慢,让我用虚节点方法来实现(具体方法的名字也许跟这有出处),这个方法的意思是先添加根节点,点击根节点那个“+”号后又立刻添加根节点下的子节点,再点击根节点下的子节点的那个“+”后,又添加此节点的子节点,以此反复,如果用户不点击那个“+”,按组长的意思就是不添加选中节点的子节点(表述不好,见谅!),请问这个怎么实现呢,哪位高手帮下忙,谢谢!!!

------解决方案--------------------
先选出最顶级节点,添加到tree,这是根节点,然后点击加号时,触发BeforeExpand事件,在这里根据当前节点的内容,再去筛选xml的下一层节点,然后添加到当前节点的下级
------解决方案--------------------
C# code
       /// <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);
}
}