Asp.net Treeview绑定问题

xiaolu0575 2009-03-24 04:16:05
数据库表结构
id name grade isEnd
01 a 1 0
0101 b 2 0
010102 c 3 1
02 d 1 0
0201 e 2 1
03 f 1 0
0301 g 2 1

grade 代表级别 1,2,3
isEnd 是否为末级 0不是,1是

//树的绑定
private void BuilderTree(int ParentID, TreeNode pNode)
{
TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
string sql = "select * from inventoryclass";
DataSet ds = DBHelper.GetData(sql);

DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[isEnd] = " + ParentID;
foreach (DataRowView row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{
//添加根节点
Node.Text = row["name"].ToString();
TreeView1.Nodes.Add(Node);
Node.Expanded = true;
BuilderTree(int.Parse(row["id"].ToString()),Node);//递归
}
else
{
//添加当前节点的子节点
Node.Text = row["name"].ToString();
pNode.ChildNodes.Add(Node);
Node.Expanded = true;
BuilderTree(int.Parse(row["id"].ToString()), Node);//递归

}
}

}



//PageLoad 事件
protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
BuilderTree(0, (TreeNode)null);
}

}




出来的结果是子节点都加在第一个父节点上了

...全文
402 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolu0575 2009-03-26
  • 打赏
  • 举报
回复
定死了的写法
xiaolu0575 2009-03-26
  • 打赏
  • 举报
回复
public void Fin(TreeNode node )
{
string sql = "select * from inventoryclass where grade=1";
DataSet ResultSet = DBHelper.GetData(sql);
foreach (DataRow row in ResultSet.Tables[0].Rows) //一级节点
{
TreeNode tn = new TreeNode(row["name"].ToString(), row["id"].ToString());
this.TreeView1.Nodes.Add(tn);


if (row["isEnd"].ToString() != "1")//二级
{
string sqll = "select * from inventoryclass where grade=2 and left(id,2)=" + tn.Value;
DataSet rs = DBHelper.GetData(sqll);
foreach (DataRow rows in rs.Tables[0].Rows)
{
TreeNode tns = new TreeNode(rows["name"].ToString(), rows["id"].ToString());
tn.ChildNodes.Add(tns);


if (rows["isEnd"].ToString() != "1")//若不为末级,三级
{
string sqlll = "select * from inventoryclass where grade=3 and left(id,4)=" + tns.Value;
DataSet ds = DBHelper.GetData(sqlll);
foreach (DataRow dr in ds.Tables[0].Rows)
{
TreeNode tnn = new TreeNode(dr["name"].ToString(), dr["id"].ToString());
tns.ChildNodes.Add(tnn);


if (dr["isEnd"].ToString() != "1")//若不为末级,四级
{
string sqllll = "select * from inventoryclass where grade=4 and left(id,6)=" + tnn.Value;
DataSet dsf = DBHelper.GetData(sqlll);
foreach (DataRow drf in dsf.Tables[0].Rows)
{
TreeNode tnf = new TreeNode(drf["name"].ToString(), drf["id"].ToString());
tnn.ChildNodes.Add(tnf);
}
}
}
}

}

}
}
}
xiaolu0575 2009-03-25
  • 打赏
  • 举报
回复
TreeNodePopulate 也用了,但不知道为什么出来的是空页面
巴掌锅 2009-03-25
  • 打赏
  • 举报
回复
建议你把数据库优化下
绑定tree view 是有递归的方法 先绑定父级节点
接着使用tree view的TreeNodePopulate事件绑定父级节点下的子节点
但是select语句要写好
xiaolu0575 2009-03-25
  • 打赏
  • 举报
回复
表结构是不能更改的
xiaolu0575 2009-03-25
  • 打赏
  • 举报
回复
表结构不能改
lonelySurvive 2009-03-25
  • 打赏
  • 举报
回复
id name grade isEnd
01 a 1 0
0101 b 2 0
010102 c 3 1
02 d 1 0
0201 e 2 1
03 f 1 0
0301 g 2 1

改表的设计,把isEnd 和 grade合并为 parentId
id 编号按123....这样编

如果是根节点,则 paerntId =0
如果不是,则标记为它是属于哪个节点的子节点

你那个表改过来后应该是

id name parentId
1 a 0
2 b 1
3 c 2
4 d 0
5 e 4
6 f 0
7 g 6

这样就能用你那个代码了
xiaolu0575 2009-03-25
  • 打赏
  • 举报
回复
这个方法不可用,请指教
lonelySurvive 2009-03-25
  • 打赏
  • 举报
回复
LZ啊,我仔细看了你代码,你是不是代码是单独找的,然后表示自己设计的?

我们来仔细分析下
dvTree.RowFilter = "[isEnd] = " + ParentID;//首先你parentId是0,你第1次筛选
就把所有isEnd为0的筛选出来了
结果是
id name grade isEnd
01 a 1 0
0101 b 2 0

02 d 1 0

03 f 1 0
然后进行递归,因为第1个节点的id 是01
所以第2次调用
BuilderTree(int ParentID, TreeNode pNode) 这个方法的时候,paentid=1(你是用的INT,所以会被转化为1),noed为刚才的那个节点
然后筛选
就把所有isEnd为1的筛选出来了

id name grade isEnd

010102 c 3 1

0201 e 2 1

0301 g 2 1

你说会不会把所有节点加在第1个父节点上

LZ你思路都没搞清楚啊.............
  • 打赏
  • 举报
回复
表设计的确实有问题哦!
tomiji 2009-03-24
  • 打赏
  • 举报
回复
2楼的正解,今天太晚了,先睡觉,收藏了,明天来帖代码
叶子 2009-03-24
  • 打赏
  • 举报
回复
数据库设计的确实有点问题。
你加个断点调试一下你的递归。
lonelySurvive 2009-03-24
  • 打赏
  • 举报
回复
读取的时候就递归就好了
    protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
AddTree(0, (TreeNode)null);
}
}

public void AddTree(int ParentID, TreeNode pNode)
{
//获取你的表
DataView dvTree = new DataView(ds.Tables[0]);

dvTree.RowFilter = "[id] = " + ParentID;

foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{
Node.Text = Row["name"].ToString();
Node.Value = Row["name"].ToString();
//可以设置跳转的页面
//Node.NavigateUrl = Row["NavigationUrl"].ToString();
//可以设置你鼠标移上去显示的提示
//Node.ToolTip = Row["description"].ToString();
TreeView1.Nodes.Add(Node);
//Node.Expanded = true;
AddTree(Int32.Parse(Row["id"].ToString()), Node);
}
else
{
Node.Text = Row["name"].ToString();
Node.Value = Row["name"].ToString();
//Node.NavigateUrl = Row["NavigationUrl"].ToString();
//Node.ToolTip = Row["description"].ToString();

pNode.ChildNodes.Add(Node);
//Node.Expanded = true;
AddTree(Int32.Parse(Row["id"].ToString()), Node);
}
}
}



思路就是先筛选父节点为0的,代表根节点,然后依次递归
lonelySurvive 2009-03-24
  • 打赏
  • 举报
回复
你这个表设计的冗余就很大

3个字段就能解决问题

id name parentId
1 水果 0
2 梨子 1
3 香蕉 1
4 汽车 0
5 轿车 4
6 速腾 5
7 保罗 5
8 卡车 4
9 kav 8
10 df 8

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧