递归法添加节点到treeview的问题?
我的代码
private void Bind_tvShowCity(TreeNode pNode,int pareID)
{
DataView dv = this.GetMangaeItem( "select * from [infinityTree] ");
dv.RowFilter = "[pareID]= " + pareID;
TreeNode tempNode = new TreeNode();
foreach (DataRowView drv in dv)
{
if (pNode==null)
{
tempNode.Text=drv[ "name "].ToString();
tempNode.NavigateUrl=drv[ "url "].ToString();
tempNode.Expanded = false;
this.tvShowCity.Nodes.Add(tempNode);
Bind_tvShowCity(tempNode, Int32.Parse(drv[ "id "].ToString()));
}
else
{
tempNode.Text = drv[ "name "].ToString();
tempNode.NavigateUrl = drv[ "url "].ToString();
tempNode.Expanded = false;
pNode.ChildNodes.Add(tempNode);
Bind_tvShowCity(tempNode, Int32.Parse(drv[ "id "].ToString()));
}
}
}
出错提示:
索引必须位于该列表的界限内。
参数名: index
我现在知道是这行: pNode.ChildNodes.Add(tempNode); 有错,
我看别人做的是这样:pNode.Nodes.Add(tempNode);
为什么我建的TreeNode tempNode = new TreeNode();
在调pNode时,没有Nodes属性??
谢谢讲解??
[解决办法]
#region 递归绑定同一个表数据
private void InitTree()
{
DataTable dt = GetTreeViewTable();
DataView dv = new DataView(dt);
dv.RowFilter = "ParentID=0 ";
TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
foreach (DataRowView drv in dv)
{
TreeNode node = new TreeNode();
node.Text = drv[ "text "].ToString();
node.Value = drv[ "ID "].ToString();
node.Expanded = false;
TreeView1.Nodes.Add(node);
AddReplies(dt,node);
}
}
private DataTable GetTreeViewTable()
{
string constring = System.Configuration.ConfigurationSettings.AppSettings[ "ConnectionString "];
SqlConnection con = new SqlConnection(constring);
SqlDataAdapter da = new SqlDataAdapter( "SELECT * FROM treeview ", con);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
private void AddReplies(DataTable dt, TreeNode node)
{
DataView dv = new DataView(dt);
dv.RowFilter = "ParentID= ' " + node.Value + " ' ";
foreach (DataRowView row in dv)
{
TreeNode replyNode = new TreeNode();
replyNode.Text = row[ "text "].ToString();
replyNode.Value = row[ "ID "].ToString();
replyNode.Expanded = false;
node.ChildNodes.Add(replyNode);
AddReplies(dt,replyNode);
}
}
#endregion
}
[解决办法]
专业邦定,,
[解决办法]
ChildNodes 是asp 2.0的treenode属性nodes是1.1的
[解决办法]
再稍稍优化一下代码
把 Bind_tvShowCity(tempNode, Int32.Parse(drv[ "id "].ToString())); 放到 if语句外面
private void Bind_tvShowCity(TreeNode pNode,int pareID)
{
DataView dv = this.GetMangaeItem( "select * from [infinityTree] ");
dv.RowFilter = "[pareID]= " + pareID;
foreach (DataRowView drv in dv)
{
//每次循环时都创建一个tempNode
TreeNode tempNode = new TreeNode();
if (pNode==null)
{
tempNode.Text=drv[ "name "].ToString();
tempNode.NavigateUrl=drv[ "url "].ToString();
tempNode.Expanded = false;
this.tvShowCity.Nodes.Add(tempNode);
}
else
{
tempNode.Text = drv[ "name "].ToString();
tempNode.NavigateUrl = drv[ "url "].ToString();
tempNode.Expanded = false;
pNode.ChildNodes.Add(tempNode);
}
//把两句相同的调用放到if外面
Bind_tvShowCity(tempNode, Int32.Parse(drv[ "id "].ToString()));
}
}