在线等:TreeView的分级

MasterLRC 2003-09-13 10:28:14
我通过SQLServer数据库动态生成TreeView 用递归

可是树显示出来以后没有分级,全在一级上,麻烦各位看一下,问题在哪?

递归程序如下:

private void initTree(Microsoft.Web.UI.WebControls.TreeNodeCollection Nds,string parentId)
{
DataView dv = new DataView();
Microsoft.Web.UI.WebControls.TreeNode tmpNode = new TreeNode();

string intId;

dv.Table = mySet.Tables["treenode"];
dv.RowFilter = "fun_code like '"+parentId+"%' and fun_code <> '" + parentId + "'";

foreach(DataRowView dvrow in dv)
{
tmpNode = new TreeNode();
tmpNode.ID = (string)dvrow["fun_code"];
tmpNode.Text = (string)dvrow["fun_name"];
if(dvrow["url"] != "")
{
//tmpNode.NavigateUrl = (string)dvrow["url"];
}
intId = (string)dvrow["fun_code"];

Nds.Add(tmpNode);

initTree(Nds[Nds.Count-1].Nodes,intId);
}
}
...全文
65 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
有点明白了,试ing
redfoxhuang 2003-09-13
  • 打赏
  • 举报
回复
这样肯定能找出来,但是,你第一次就把所有的都找出来了,所以都在一层上了,就是
panyee(快乐王子)所说的,缺少长度判断,或者你可以给数据表加个字段,parentid
纪录父节点id,虽然修改数据库表不太好,不过这样相对好控制一些
panyee 2003-09-13
  • 打赏
  • 举报
回复
少了子节点长度判断, 就会把所有的子节点,即子节点的子节点全都查出来
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
这句我在SQL查询分析器中测试通过了

select fun_code from bs_fun_tree where fun_code like '07%' and fun_code <> '07'

结果集:

0701
070101
07010101
07010104
07010105
070102
07010201
07010203
0702
070201
070203
070204
070205
070209
0703
070301
070302
070306
070307
070308
070309
070311
070312
070313
0704
070401
070404
070410
070411
070412
070413
0705
070501
070502
070505
070506
070507
070508
070510
070511
0706
070601
070602
070603
070604
070610
070611
070612
070613
070614
070615
0707
070701
070706
070707
070711
070712
070713
070714
070715
070716
070717
070718
0708
070801
070802
070803
070810
070811
070812
070813
070814
070815
0709
070901
070902
070906
070908
panyee 2003-09-13
  • 打赏
  • 举报
回复
fun_code <> '010701' ==> fun_code <> '0701'
panyee 2003-09-13
  • 打赏
  • 举报
回复
dv.RowFilter = "fun_code like '"+parentId+"%' and fun_code <> '" + parentId + "'";

改成这样:
fun_code like '0701%' and fun_code <> '010701' and (len(fun_code) - 2)=len('0701')
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
我的目的是过滤出该结点的子节点

redfoxhuang 2003-09-13
  • 打赏
  • 举报
回复
like 07,but != 07
redfoxhuang 2003-09-13
  • 打赏
  • 举报
回复
dv.RowFilter = "fun_code like '"+parentId+"%' and fun_code <> '" + parentId + "'";
这个判断,好像070101和0701是一样的,就是说,他们like 07,but ! 07,或许是这个问题
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
现贴出程序的完整代码如下:


using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using Microsoft.Web.UI.WebControls;

namespace wealthMIS
{
/// <summary>
/// funTree 的摘要说明。
/// </summary>
public class funTree : System.Web.UI.Page
{
SqlConnection Conn;
protected Microsoft.Web.UI.WebControls.TreeView treeV;
protected DataSet mySet;

private void Page_Load(object sender, System.EventArgs e)
{
mySet = new DataSet();
CreateRenderDataSet();
initTree(treeV.Nodes,"");
// 在此处放置用户代码以初始化页面
}

//生成数据集
private void CreateRenderDataSet()
{
string Str_Conn = (System.Configuration.ConfigurationSettings.AppSettings["Conn"]);
Conn = new SqlConnection(Str_Conn);
Conn.Open();

SqlDataAdapter myCommand = new SqlDataAdapter("select * from bs_fun_tree",Conn);

myCommand.Fill(mySet,"treenode");
}

//生成树
private void initTree(Microsoft.Web.UI.WebControls.TreeNodeCollection Nds,string parentId)
{
DataView dv = new DataView();
Microsoft.Web.UI.WebControls.TreeNode tmpNode = new TreeNode();

string intId;

dv.Table = mySet.Tables["treenode"];
dv.RowFilter = "fun_code like '"+parentId+"%' and fun_code <> '" + parentId + "'";

foreach(DataRowView dvrow in dv)
{
tmpNode = new TreeNode();
tmpNode.ID = (string)dvrow["fun_code"];
tmpNode.Text = (string)dvrow["fun_name"];
if(dvrow["url"] != "")
{
//tmpNode.NavigateUrl = (string)dvrow["url"];
}
intId = (string)dvrow["fun_code"];

Nds.Add(tmpNode);


initTree(tmpNode.Nodes,intId);
}
}
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
fun_code列每两个字符表示一级目录,

示例如下

fun_code fun_name

07 卡片管理
0701 卡片管理-->>抄表卡片管理
070101 卡片管理-->>抄表卡片管理-->>抄表卡片登记
07010101 卡片管理-->>抄表卡片管理-->>抄表卡片登记-->>抄表卡片支领登记
07010104 卡片管理-->>抄表卡片管理-->>抄表卡片登记-->>抄表卡片归还登记
happytaotao 2003-09-13
  • 打赏
  • 举报
回复
同病相怜啊
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
不行啊,还是不分级


我的主界面只是拖了一个 TreeView ,把 ID 改成 treeV

在page_load中调用:以上的递归:


initTree(treeV.Nodes,"");
MasterLRC 2003-09-13
  • 打赏
  • 举报
回复
OK了,谢谢大家

我把源码贴出来大家参考:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using Microsoft.Web.UI.WebControls;

namespace wealthMIS
{
/// <summary>
/// funTree 的摘要说明。
/// </summary>
public class funTree : System.Web.UI.Page
{
SqlConnection Conn;
protected Microsoft.Web.UI.WebControls.TreeView treeV;
protected DataSet mySet;

private void Page_Load(object sender, System.EventArgs e)
{
mySet = new DataSet();
CreateRenderDataSet();
initTree(treeV.Nodes,"",1);
// 在此处放置用户代码以初始化页面
}

//生成数据集
private void CreateRenderDataSet()
{
string Str_Conn = (System.Configuration.ConfigurationSettings.AppSettings["Conn"]);
Conn = new SqlConnection(Str_Conn);
Conn.Open();

SqlDataAdapter myCommand = new SqlDataAdapter("select * from bs_fun_tree",Conn);

myCommand.Fill(mySet,"treenode");
}

//生成树
private void initTree(Microsoft.Web.UI.WebControls.TreeNodeCollection Nds,string parentId,int levelId)
{
DataView dv = new DataView();
Microsoft.Web.UI.WebControls.TreeNode tmpNode = new TreeNode();

string intId;
int intLevel;

dv.Table = mySet.Tables["treenode"];
string sql = "fun_code like '"+parentId.Trim()+"%' and fun_level = " + levelId;
dv.RowFilter = sql;
foreach(DataRowView dvrow in dv)
{
tmpNode = new TreeNode();
tmpNode.ID = (string)dvrow["fun_code"];
tmpNode.Text = (string)dvrow["fun_name"];

if(dvrow["url"] != "")
{
//tmpNode.NavigateUrl = (string)dvrow["url"];
}
intId = (string)dvrow["fun_code"];
intLevel = (int)dvrow["fun_level"];

Nds.Add(tmpNode);


initTree(tmpNode.Nodes,intId,intLevel+1);
}
}
2002pine 2003-09-13
  • 打赏
  • 举报
回复
initTree(Nds[Nds.Count-1].Nodes,intId);
--》
initTree(tmpNode.Nodes,intId);

62,041

社区成员

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

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

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

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