用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.Value为CategoryId</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 depth为0,ChildNode 的depth为1.
估计就是因为这个原因,参数范围出界吧。?
去了一上Msdn
使用 Depth 属性确定节点的深度。深度表示一个节点与根节点之间的层级数。例如,根节点的深度为 0。根节点的子节点的深度为 1,依此类推。我靠,数据结构的东西啊,呵呵,多久不用,就忘了。
寻寻觅觅,后来在网上找到一个相关的:
问题出在哪儿呢?
请看上面的紫色一行代码: TreeNode tmpNode = new TreeNode();,把放到下面的循环就可以了。
为什么呢?
_currentNode 不会添加一个同样的节点超过两次!
所以,每一次循环,都要实例化一个新结点,指向一个新的引用地址。
呵呵,此问题结束。明白了吗?