【问题标题】:treeview infinite loop树视图无限循环
【发布时间】:2012-01-01 15:28:30
【问题描述】:

我正在尝试制作一个具有无限子组的treeView

我可以添加我的群组,但我无法添加我的子群组。对于子组,输出显示我的组值。我的子组代码如下:我认为我的 SQL 字符串有问题,但我不知道是什么问题。

private void chilnoddoldur(DataTable dt, TreeNodeCollection treeNodeCollection)
//fill childnodes
{
    foreach (DataRow dr in dt.Rows)
    {
        TreeNode child = new TreeNode();
        child.Text = dr["kgr_ad"].ToString();
        child.Value = dr["kgr_bsno"].ToString();
        if (child.ChildNodes.Count > 0)
        {
            child.PopulateOnDemand = true;
        }
        child.SelectAction = TreeNodeSelectAction.SelectExpand;
        child.Expand();
        child.Selected = true;
        treeNodeCollection.Add(child);
   }
}

这是 SQL 代码:

SqlConnection conn = b.baglan();
if (conn.State == ConnectionState.Open) 
{ 
    conn.Close();
} 
conn.Open(); 
SqlCommand cmd = new SqlCommand("select kgr_sno,kgr_ad,kgr_bsno from kulgrp where kgr_bsno=@id", conn); 
cmd.Parameters.AddWithValue("@id", kgrSno); 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
DataTable dt = new DataTable(); 
da.Fill(dt); 
kgrBsno.ChildNodes.Clear(); 
chilnoddoldur(dt, kgrBsno.ChildNodes); 
conn.Close();

【问题讨论】:

  • 一个建议:使用更具描述性的方法名称。 “chilnoddoldur”不是很有帮助。
  • 只是填充子节点的方法名。
  • Recursive TreeView in ASP.NET 的可能重复项
  • code SqlConnection conn = b.baglan(); if (conn.State == ConnectionState.Open) { conn.Close();在这里我忘了放这个代码。是的递归,但我不明白确切的错误..? } conn.Open(); SqlCommand cmd = new SqlCommand("select kgr_sno,kgr_ad,kgr_bsno from kulgrp where kgr_bsno=@id", conn); cmd.Parameters.AddWithValue("@id", kgrSno); SqlDataAdapter da = new SqlDataAdapter(cmd);数据表 dt = 新数据表(); da.填充(dt); kgrBsno.ChildNodes.Clear(); chilnddoldur(dt, kgrBsno.ChildNodes); conn.Close();code
  • @user1054616:编辑您的问题以添加 SQL 部分,然后删除您的最后一条评论。

标签: c# asp.net treeview


【解决方案1】:

如果某个节点有子节点,你应该创建递归 - 再次调用 chilnoddoldur 方法,但传递适当的参数很重要:数据表应该只有包含子元素的行,而 treeNodeCollection 应该代表当前节点的 childNodeCollection。它应该看起来像这样:

if (child.ChildNodes.Count > 0)
{
    child.PopulateOnDemand = true;
    //recursion call - childDt is datatable with childnode rows
    chilnoddoldur(childDt, child.ChildNodes)
}

如果这个子节点中的某些子节点有自己的子节点,它会再次进行递归调用,如果没有,当方法用完时,它会继续运行它的父方法,等等。

我希望我足够清楚,可以给你一个基本的想法。

【讨论】:

  • 我像你说的那样编辑了我的代码,但没有..结果相同..我的子节点再次获取节点
  • 现在我只能看到一个子组:S 我看不到更多..但是我想查看我拥有的所有子组..
  • 最棘手的部分是创建逻辑来过滤数据表中的行,从而为递归调用创建子数据表。它必须包含所有子节点及其子节点(如果有) - 所以在下一个“子递归”中,它使用相同的逻辑来过滤子节点等。听起来有问题,但如果你告诉我们会更容易一些代码。
【解决方案2】:
foreach (DataRow dr in dt.Rows)
    {
        TreeNode child = new TreeNode();
        child.Text = dr["kgr_ad"].ToString();
        child.Value = dr["kgr_sno"].ToString();

           child.CollapseAll();

            kgrBsno.ChildNodes.Add(child);
            AltGruplariYaz(child, Convert.ToInt32(dr["kgr_sno"]));
}

我的问题的答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2011-12-10
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多