用TreeNode动态创建树时,递归第二次到这里就出现索引必须位于该列表的界限内。

TreeNode动态创建树时,递归第二次到这里就出现索引必须位于该列表的界限内。

出现下列问题:

索引必须位于该列表的界限内。
参数名: index

 

 

 

150:            ChildNode.NavigateUrl = NodeNavigateUrl;    //设置节点的Url

151:

152:            ParentNode.ChildNodes.Add(ChildNode);   //将子节点加入到父节点

153:        }

154:

 

 

核心代码:

 1如果有孩子     

 if (bllAppend.DataIsExist(SqlHelper.ConnectionStringLocalTransaction, str_checkChildren))//如果有子孩子

            {

                CreateSubTree(currentNode);

            }

2 创建子树

CreateSubTree

        /// <summary>

        /// 创建当前结点的子结点。

        /// </summary>

        /// <param name="_currentNode">当前结点;_currentNode.ValueCategoryId</param>

        /// <returns>经处理后的当前节点</returns>

        private void CreateSubTree(TreeNode _currentNode)

        { 

            string str_checkChildren = "Select * from Categories where FatherId=";

            if (bllAppend.DataIsExist(SqlHelper.ConnectionStringLocalTransaction,

                str_checkChildren+SqlStringConstructor.GetQuotedString(_currentNode.Value)))

            {

                CategoryBLL categoryBLL2 = new CategoryBLL();

                DataTable tmpdt = categoryBLL2.ShowChildsByFatherId(_currentNode.Value);

                TreeNode tmpNode = new TreeNode();

                int count = tmpdt.Rows.Count;

                for (int i = 0; i < count; i++)

                {

 

                    AddNode(_currentNode, tmpNode, tmpdt.Rows[i]["CategoryName"].ToString(),

                            tmpdt.Rows[i]["CategoryId"].ToString(), str_childname + tmpdt.Rows[i]["CategoryId"].ToString());

                    //如果当前结点有子节点,就向下遍历子节点。

                    if(bllAppend.DataIsExist(SqlHelper.ConnectionStringLocalTransaction,

                                             str_checkChildren+SqlStringConstructor.GetQuotedString(tmpNode.Value)))

                    {

                    CreateSubTree(tmpNode);

                    }

 

                }

 

            }

         

          

        }

 

 

 

 

3 添加新节点

 

        /// <summary>

        /// 添加新节点

        /// </summary>

        /// <param name="ParentNode"></param>

        /// <param name="ChildNode"></param>

        /// <param name="NodeText"></param>

        /// <param name="NodeValue"></param>

        /// <param name="NodeNavigateUrl"></param>

        private void AddNode(TreeNode ParentNode, TreeNode ChildNode, string NodeText, string NodeValue, string NodeNavigateUrl)

        {

            ChildNode.Text = NodeText;      //设置节点的显示文字

            ChildNode.Value = NodeValue;    //设置节点的数值

            ChildNode.NavigateUrl = NodeNavigateUrl;    //设置节点的Url

 

            ParentNode.ChildNodes.Add(ChildNode);   //将子节点加入到父节点

        }

 

 

调试时发现:ParentNode depth0ChildNode 的depth1.

估计就是因为这个原因,参数范围出界吧。?

 

去了一上Msdn

使用 Depth 属性确定节点的深度。深度表示一个节点与根节点之间的层级数。例如,根节点的深度为 0。根节点的子节点的深度为 1,依此类推。我靠,数据结构的东西啊,呵呵,多久不用,就忘了。

寻寻觅觅,后来在网上找到一个相关的:

问题出在哪儿呢?

请看上面的紫色一行代码:  TreeNode tmpNode = new TreeNode();,把放到下面的循环就可以了。

为什么呢?

_currentNode 不会添加一个同样的节点超过两次!

所以,每一次循环,都要实例化一个新结点,指向一个新的引用地址。

呵呵,此问题结束。明白了吗?

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值