首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

有关treeview添加节点的有关问题

2012-05-31 
有关treeview添加节点的问题?用一个Treeview来接收任意个Xml文件,以前我是用递归来实现的,但组长说递归处

有关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);
}
}

热点排行