100分求treeview 用法代码

wf_wang 2008-04-26 01:32:31
我的类别设置是这样的 3个长度为一个级别
表 table
A B C
1 000 类别1
2 001 类别2
3 002 类别3
4 000000 类别11
5 001000 类别21
6 002001 类别32

怎么写递归把所有类别输出,求完整代码c#,谢谢,急用
...全文
150 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
q114515704 2008-04-27
  • 打赏
  • 举报
回复
学习
wenzheng2k 2008-04-27
  • 打赏
  • 举报
回复
如果类别代号是类似固定格式,可以先按代号排序,保证父在子前面,之后循环添加节点,可以不用递归,再建一个Hash表存类别代号和TreeNode的对应关系用来查找,可以更快一些.
Kevin_LiuFeng 2008-04-27
  • 打赏
  • 举报
回复
上面代码都写了,没啥好写的了。楼主还不结帖?
chengqscjh 2008-04-27
  • 打赏
  • 举报
回复

/// <summary>
/// 递归添加树的节点
/// </summary>
/// <param name="ParentID"></param>
/// <param name="pNode"></param>
public void AddTree(int ParentID,TreeNode pNode)
{
DataSet ds=(DataSet) this.ViewState["ds"];
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[parentId] = " + ParentID;

foreach(DataRowView Row in dvTree)
{
TreeNode Node=new TreeNode() ;
if(pNode == null)
{//添加根节点
Node.Text = Row["name"].ToString();
TreeView1.Nodes.Add(Node);
//Node.Expanded=false;//是否展开若设置为true 则ExpandLevel="1"无效
AddTree(Int32.Parse(Row["ID"].ToString()), Node); //再次递归
}
else
{
//添加当前节点的子节点
Node.Text = Row["name"].ToString();
//Node.Target = mainFrame;
Node.NavigateUrl = Row["url"].ToString();
pNode.Nodes.Add(Node);
//Node.Expanded = false;
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
}
}


}
}
yutian1225 2008-04-27
  • 打赏
  • 举报
回复
public void InitTree(TreeView tree,DataSet ds,bool expand)
{
tree.Nodes.Clear();
if (null == ds) return;
if (ds.Tables.Count <= 0) return;

DataRow[] rowList = ds.Tables[0].Select(TableTree.FATHERID + "='-1'",TableTree.ORDERBY);
foreach (DataRow row in rowList)
{
TreeNode node = new TreeNode();
node.Text = row[TableTree.DESN].ToString();
node.NavigateUrl = "MainManage.aspx?TableName=" + row[TableTree.TABLENAME].ToString()
+ "&TreeID=" + row[TableTree.TABLETREEID].ToString();
node.Target = "Main";
node.Value = row[TableTree.TABLETREEID].ToString() + "|" + row[TableTree.TABLENAME].ToString();
tree.Nodes.Add(node);

CreateSubTree(node,ds,expand);
}
}

/// <summary>
/// 创建树的子结点
/// </summary>
public void CreateSubTree(TreeNode parentNode,DataSet ds,bool expand)
{
string value = parentNode.Value.Substring(0,parentNode.Value.IndexOf("|"));
DataRow[] rowList = ds.Tables[0].Select(TableTree.FATHERID + "='" + value + "'",TableTree.ORDERBY);
foreach (DataRow row in rowList)
{
TreeNode node = new TreeNode();
node.Text = row[TableTree.DESN].ToString();
node.NavigateUrl = "MainManage.aspx?TableName=" + row[TableTree.TABLENAME].ToString()
+ "&TreeID=" + row[TableTree.TABLETREEID].ToString();
node.Target = "Main";
node.Value = row[TableTree.TABLETREEID].ToString() + "|" + row[TableTree.TABLENAME].ToString();
parentNode.ChildNodes.Add(node);

CreateSubTree(node,ds,expand);
}
}
长弓大侠 2008-04-27
  • 打赏
  • 举报
回复
public void Condata()  //获取数据
{
empid = Session[OilPipe.PubInfo.PublicInfo.sEmpID].ToString();
username = Session[OilPipe.PubInfo.PublicInfo.sUserName].ToString();
StringBuilder sb = new StringBuilder();

if (Session[OilPipe.PubInfo.PublicInfo.sUserAdminFlag].ToString() == "Y")
{
sb.Append(" SELECT DIR_ID DIR_ID, FATHER_ID FATHER_ID,DIR_NAME DIR_NAME ");
sb.Append(" FROM OP_DIR ORDER BY DIR_ID");
}
else
{
sb.Append(" SELECT DIR_ID DIR_ID, FATHER_ID FATHER_ID,DIR_NAME DIR_NAME ");
sb.Append(" FROM OP_DIR ");
sb.Append(" WHERE file_ctl.dir_aprv(dir_id,'" + empid + "','10') = 'Y' ");
sb.Append(" ORDER BY DIR_ID ");
}

string sql = sb.ToString();
DataSet ds = dbop.ExecSQLReDataSet(sql);
this.ViewState["ds"] = ds;

AddTree(startnode, (TreeNode)null);
}



public void AddTree(string id, TreeNode pNode)
{
DataSet ds = (DataSet)this.ViewState["ds"];
DataView dv = new DataView(ds.Tables[0]); //取出数据填充数据视图
dv.RowFilter = "FATHER_ID = '" + id + "'"; //用数据视图进行子节点筛选把所有的子当前下的所有子节点筛选



foreach (DataRowView row in dv)
{
TreeNode node = new TreeNode();
if (pNode == null) //说明是页节点
{
node.Text = row["DIR_NAME"].ToString(); //从行视图中取出字段的值
node.ToolTip = row["DIR_NAME"].ToString();
node.NavigateUrl = url + "?dirId=" + row["DIR_ID"].ToString();
node.Target = target;

TreeView1.Nodes.Add(node); //添加子节点
AddTree(row["DIR_ID"].ToString(), node); //递归调用
}
else //如果子节点再继续递归
{
node.ToolTip = row["DIR_NAME"].ToString();
node.Text = row["DIR_NAME"].ToString();
node.NavigateUrl = url + "?dirId=" + row["DIR_ID"].ToString();
node.Target = target;

pNode.ChildNodes.Add(node);
AddTree(row["DIR_ID"].ToString(), node);
}
}
}

项目原版代码,我直接粘过来的
fcxxfcxx 2008-04-27
  • 打赏
  • 举报
回复
zc
gauzxj 2008-04-26
  • 打赏
  • 举报
回复
递归添加!!!!
panxuan 2008-04-26
  • 打赏
  • 举报
回复
类别与类别没有关联吗?最好创建关联。子父关系?
zjysky 2008-04-26
  • 打赏
  • 举报
回复
循序递归啊。 你还是看算法去啊
renyu732 2008-04-26
  • 打赏
  • 举报
回复
表 table
A(ID) B(ParentID) C
1 0 类别1
2 0 类别2
3 0 类别3
4 1 类别11
5 2 类别21
6 3 类别32

也就是ParentID写的是ID的编号。

代码如下。

/// <summary>
/// 递归添加树的节点
/// </summary>
/// <param name="ParentID"></param>
/// <param name="pNode"></param>
public void AddDefaultTree(int ParentID,TreeNode pNode)
{
try
{
DataView dvTree = new DataView();
dvTree=//返回数据;
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[PARENTID] = " + ParentID;
foreach(DataRowView Row in dvTree)
{
TreeNode Node=new TreeNode() ;
if(pNode == null)
{
//添加根节点
Node.NavigateUrl=Row["TargetURL"].ToString();
Node.Target=Row["TargetWindow"].ToString();
Node.Text= "<img src='images/main/leftmenuicon4.gif' border='0' hspace='3' align='absmiddle'><span onmousemove=javascript:title='"+Row["MenuName"]+"'>"+Row["MenuName"].ToString().Trim()+"</span>";
this.OAModualMenu.Nodes.Add(Node);
Node.Expanded=false;
AddTree(Int32.Parse(Row["MenuID"].ToString()), Node); //再次递归
}
else
{
//添加当前节点的子节点
Node.Text= "<Li type='square'><span onmousemove=javascript:title='"+Row["MenuName"].ToString()+"'>"+Row["MenuName"].ToString().Trim()+"</span></Li>";
Node.NavigateUrl=Row["TargetURL"].ToString();
Node.Target=Row["TargetWindow"].ToString();
pNode.Nodes.Add(Node);
Node.Expanded = false;
AddTree(Int32.Parse(Row["MenuID"].ToString()), Node); //再次递归
}
}
}
catch
{
}
}


//调用,比如在Page_Load()事件中:
//调用递归函数,完成树形结构的生成
this.AddTree(0, (TreeNode)null);
黄土豆 2008-04-26
  • 打赏
  • 举报
回复
DataTable 的 Select应该可以过滤如

dt.Select("B like '" + pid + "???'" ); 这样返回的DataRow数量应该少点,开销小点,不过这方法我没试过,所以没写出来,你试试。
黄土豆 2008-04-26
  • 打赏
  • 举报
回复
试着写了下,没做测试,你试试。

System.Data.DataTable dt;//设你已经查询出了DataTable,做为全局变量,当然做为参数传递也可以。

//==========================================
TreeView tv = new TreeView(); //新建一个TreeView
System.Data.DataRow[] drs = dt.Select();
foreach (System.Data.DataRow dr in drs) { //将根目录加入
if (IsSubClass("", dr["B"].ToString(), 0)) {
TreeNode tn = new TreeNode();
tn.NavigateUrl = "showclass.aspx?id" + dr["A"].ToString();
tn.Text = dr["C"].ToString();
tv.CheckedNodes.Add(tn);
AddClass(dr["B"].ToString(), tn, 1); //加子目录
}
}

//===========================


public void AddClass(string pid, TreeNode pnode, int depth) {
System.Data.DataRow[] drs = dt.Select();
foreach (System.Data.DataRow dr in drs) {
if(IsSubClass(pid,dr["B"],depth +1)){ //判断为子目录
TreeNode tn = new TreeNode();
tn.NavigateUrl = "showclass.aspx?id" + dr["A"].ToString();
tn.Text = dr["C"].ToString();
pnode.ChildNodes.Add(tn);
AddClass(dr["B"].ToString(), tn, depth++); //递归
}
}
}
public bool IsSubClass(string pid , string cid, int depth) { //判断该目录是否为指定目录的子目录
if (cid.Length == 3 && depth == 0) //根目录深度为0,长度为3
return true; //根目录
else if (cid.Length > (depth + 1) * 3) //子目录长度为深度+1乘3
return false;
else if (cid.Substring(0, cid.Length - 3) != pid) //子目录除后面3个数外前面应与父目录的字串一样
return false;
else
return true;
}


dgdlxh 2008-04-26
  • 打赏
  • 举报
回复
TreeNode node = new TreeNode();
node.Text = "dgd 服务器";
node.Value = "0";
String sql = "select name from sysdatabases";
dt = SqlHelper.gettable(sql, "master").Tables[0];
buildtree(node,dt);
buildtreeye(node);
TreeView1.Nodes.Add(node);
for (int i = 0; i < node.ChildNodes.Count; i++)
{
node.ChildNodes[i].CollapseAll();
}
public void buildtree(TreeNode node,DataTable dtgen)
{
for (int i = 0; i < dtgen.Rows.Count; i++)
{
TreeNode gen = new TreeNode();
gen.Text = dtgen.Rows[i][0].ToString();
node.ChildNodes.Add(gen);
}
}
public void buildtreeye(TreeNode node)
{
string sql = "select name from sysobjects where xtype='u'";
for (int i = 0; i < node.ChildNodes.Count; i++)
{
dt = SqlHelper.gettable(sql, node.ChildNodes[i].Text).Tables[0];
for (int j = 0; j < dt.Rows.Count; j++)
{
buildtree(node.ChildNodes[i], dt);
}
}
}

62,243

社区成员

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

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

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

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