怎么样读取一个表中的记录写入到 TreeView 中

BigIdiot628 2005-07-14 04:17:49
有一个表,保存了一些记录。
ParentID 为主键

通过ParentID 和 ChildID分级,当记录一的ParentID为“2” 并且另有三条记录 ChildID也为“2”说明他们是父子关系。
我要读出来,写到树形控件中。
...全文
243 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
新鲜鱼排 2005-07-15
  • 打赏
  • 举报
回复
对于存入数据库中的TreeView信息我一般采用这样的建表方式
TreeViewID(主键)
MyID(本身的ID)
PID(父节点的ID)
MyID PID
1 0
101 1
102 1
这样查询的时候使用递归,查找MyID=1,然后是PID=1,PID=101以此类推。
qpl007 2005-07-15
  • 打赏
  • 举报
回复
可以这样写

private void ChangeDataToTree(DataView view,TreeNode parent)
{
foreach(DataRowView row in view)
{
TreeNode n = new TreeNode(row["Name"].ToString());
parent.ChildNodes.Add(n);
using(DataView v = new DataView(view.Table))
{
v.RowFilter = "ChildID="+row["ParentID"].ToString();
this.ChangeDataToTree(v,n);
}
}
}

调用时(假设你的第一级节点的ChildID = 0,而且你的TreeView已经实例化):
……
using(DataView view = new DataView(Table))
{
view.RowFilter = "ChildID=0";
TreeNode node = new TreeNode("根节点");
TreeView.ChildNodes.Add(node);
this.ChangeDataToTree(view,node);
}
……
新鲜鱼排 2005-07-15
  • 打赏
  • 举报
回复
呵呵,端消息太长了。
private void showtreeintreeview(int id, TreeNode node)
{
DataSet ds = new DataSet();
adapter.Fill(ds);
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = "pid=" + id.ToString(); //不同级别的节点的连接方法
TreeNode item;
foreach (DataRowView dr in dv)
{
if (node == null)
{
item = new TreeNode(); TreeView1.Nodes.Add(item);
showtreeintreeview(Convert.ToInt32(dr["id"]), item);
}
else
{
item = new TreeNode();
node.Nodes.Add(item);
showtreeintreeview(Convert.ToInt32(dr["id"]), item); }
}
}
就是类似这样的递归
要是想从叶节点开始,只要控制一下开始的点就可以了。
dutguoyi@126.com
新鲜鱼排 2005-07-15
  • 打赏
  • 举报
回复
给你回复了。在短消息里。
luyesql 2005-07-14
  • 打赏
  • 举报
回复
mark
karykwan 2005-07-14
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/community/Column/30.mspx
上有详细设置.标准答案
JasonHeung 2005-07-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/JasonHeung/archive/2005/04/15/348731.aspx
BigIdiot628 2005-07-14
  • 打赏
  • 举报
回复
我就是一次读取一个表中的所有记录.包括 Name , ParentID ,ChildID等……

当然要用ChildID区分,因为不同的ChildID对应不同的ParentID ,这样才知道生成树时的父子关系。


但我不知道怎么样用递归还来生成树
lovvver 2005-07-14
  • 打赏
  • 举报
回复
楼主的childID应该就是当前记录的ID。
其实这个很简单,从跟节点画起,然后循环画其子节点。
//画根节点
TreeView1.BootNode.Tag=....
.....
//根据根节点取出其所有的子节点,循环画它的子节点
//最好把画子节点写成一个方法,递归调用
...
gaochundu 2005-07-14
  • 打赏
  • 举报
回复
如果就是说明父子关系 一个ParentID字段就够了吧 再搞个ChildID干啥?
lyb_abiandbel 2005-07-14
  • 打赏
  • 举报
回复
我问的treeview问题,我就是在这个帖子上解决的。

http://community.csdn.net/Expert/topic/3877/3877541.xml?temp=.800564
aiur2000 2005-07-14
  • 打赏
  • 举报
回复
按ParentID 和 ChildID写进去就行了,treeview操作不太熟
loveyzy 2005-07-14
  • 打赏
  • 举报
回复
本论坛不是有人提供了一个"OA精品"嘛,里面就有现成的比较好的例子:
namespace UDS.Inc
{
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 UDS.Components;
using Microsoft.Web.UI.WebControls;
using System.Configuration;

/// <summary>
/// ClassTreeView 的摘要说明。
/// </summary>
public abstract class ClassTreeView : System.Web.UI.UserControl
{
protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
protected DataTable dataTbl1,dataTbl2;


private void Page_Load(object sender, System.EventArgs e)
{

if(!Page.IsPostBack)
{
InitRootNodeDataTable();
InitTreeRootNode(TreeView1.Nodes);
TreeView1.ExpandLevel = 1;
// TreeView1.Nodes[80].Expanded=true;
// InitTree(TreeView1.Nodes,"0");
}
}

private void ExpandNode(string NodeID)
{


}

#region 将DataReader 转为 DataTable
/// <summary>
/// 将DataReader 转为 DataTable
/// </summary>
/// <param name="DataReader">DataReader</param>
public DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader)
{
DataTable datatable = new DataTable();
DataTable schemaTable = dataReader.GetSchemaTable();
//动态添加列
foreach(DataRow myRow in schemaTable.Rows)
{
DataColumn myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = myRow[0].ToString();
datatable.Columns.Add(myDataColumn);
}
//添加数据
while(dataReader.Read())
{
DataRow myDataRow = datatable.NewRow();
for(int i=0;i<schemaTable.Rows.Count;i++)
{
myDataRow[i] = dataReader[i].ToString();
}
datatable.Rows.Add(myDataRow);
myDataRow = null;
}
schemaTable = null;
return datatable;
}
#endregion

/// <summary>
/// 初始化 RootNode DataTable
/// </summary>
private void InitRootNodeDataTable()
{
Database data = new Database();
SqlDataReader dataReader = null;
String username = Request.Cookies["Username"].Value.ToString();
SqlParameter[] prams = {
data.MakeInParam("@UserName", SqlDbType.VarChar , 20, username)

};
try
{
data.RunProc("sp_GetShowClass", prams,out dataReader);
}
catch(Exception ex)
{
Response.Write(ex.ToString());
//UDS.Components.Error.Log(ex.ToString());
}
dataTbl1 = ConvertDataReaderToDataTable(dataReader);
dataReader.Close();
dataTbl1.TableName = "TreeView";
}

/// <summary>
/// 初始化 ChildNode DataTable
/// </summary>
private void InitChildNodeDataTable(int ClassParentID)
{
Database data = new Database();
SqlDataReader dataReader = null;
SqlParameter[] prams = {
data.MakeInParam("@Class_id", SqlDbType.Int , 20, ClassParentID)
};
try
{
data.RunProc("sp_GetAllChildClass", prams,out dataReader);
}
catch(Exception ex)
{
Response.Write(ex.ToString());
//UDS.Components.Error.Log(ex.ToString());
}
dataTbl2 = ConvertDataReaderToDataTable(dataReader);
dataReader.Close();
dataTbl2.TableName = "TreeView";
}

/// <summary>
/// 初始化TreeView 的 RootNode
/// </summary>
private void InitTreeRootNode(TreeNodeCollection TNC)
{
DataView dataView = new DataView();
dataView = dataTbl1.Copy().DefaultView;
// dataView.RowFilter = "ClassParentID = ClassID";
foreach(DataRowView drv in dataView)
{
TreeNode tn = new TreeNode();
tn.ID = drv["ClassID"].ToString();
tn.Text = "<span onmousemove=javascript:title='"+drv["ClassName"]+"'>"+drv["ClassName"].ToString()+"</span>";
tn.ImageUrl = GetIcon(drv["ClassType"].ToString());
tn.NavigateUrl = "Switch.aspx?Action=1&ClassID="+drv["ClassID"].ToString();
tn.Target = "MainFrame";
TNC.Add(tn);
InitChildNodeDataTable(Int32.Parse(tn.ID.ToString()));
InitTreeChildNode(tn.Nodes,tn.ID);
}
dataTbl1 = null;
dataTbl2 = null;
}

/// <summary>
/// 初始化TreeView 的 ChildNode
/// </summary>
private void InitTreeChildNode(TreeNodeCollection TNC,string classParentID)
{
DataView dataView = new DataView();
dataView = dataTbl2.Copy().DefaultView ;
dataView.RowFilter = "ClassParentID = " + classParentID + "";
foreach(DataRowView drv in dataView)
{
TreeNode tn = new TreeNode();
tn.ID = drv["ClassID"].ToString();
tn.Text = "<span onmousemove=javascript:title='"+drv["ClassName"]+"'>"+drv["ClassName"].ToString()+"</span>";
tn.ImageUrl = GetIcon(drv["ClassType"].ToString());
tn.NavigateUrl = "Switch.aspx?Action=1&ClassID="+drv["ClassID"].ToString();
tn.Target = "MainFrame";
TNC.Add(tn);
InitTreeChildNode(tn.Nodes,tn.ID);
}
}

#region 获取节点图标
/// <summary>
/// 获取节点图标
/// </summary>
private string GetIcon(string ClassType)
{
string rtnValue = "../../DataImages/";
switch (ClassType)
{
case "0":
rtnValue+= "flag.gif" ;
break;
case "1":
rtnValue+= "myDoc.gif" ;
break;
case "2":
rtnValue+= "mail.gif" ;
break;
case "3":
rtnValue+= "page.gif" ;
break;
case "4":
rtnValue+= "staff.gif" ;
break;
case "5":
rtnValue+= "help_page.gif" ;
break;
case "6":
rtnValue+= "MyTask.gif";
break;
case "7":
rtnValue+= "mail.gif" ;
break;
case "8":
rtnValue+= "myDoc.gif" ;
break;
case "9":
rtnValue+= "DocFlow.gif" ;
break;
case "10":
rtnValue+= "ClientManage.gif" ;
break;
case "11":
rtnValue+= "myLinkman.gif" ;
break;
case "12":
rtnValue+= "position.gif" ;
break;
case "13":
rtnValue+= "roleManage.gif" ;
break;
case "14":
rtnValue+= "kaoqin.gif" ;
break;
case "15":
rtnValue+= "workadmin.gif" ;
break;
case "16":
rtnValue+= "message.gif" ;
break;
case "17":
rtnValue+= "usbkey.gif" ;
break;
default:
rtnValue+= "red_ball.gif";
break;
}
return rtnValue;
}
#endregion

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// 设计器支持所需的方法 - 不要使用
/// 代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}
qpl007 2005-07-14
  • 打赏
  • 举报
回复
可以一次性从数据库中读取所有记录到内存,然后利用DataView递归过滤来形成树!
Roaming_Sheep 2005-07-14
  • 打赏
  • 举报
回复
codeproject上C# 数据库 部分有两篇文章跟这个相关,应该可以帮到你:

Populate a TreeView from a SELF-JOINED table
http://www.codeproject.com/cs/database/2dtreeview.asp

Trees in SQL databases
http://www.codeproject.com/cs/database/Trees_in_SQL_databases.asp
niunj 2005-07-14
  • 打赏
  • 举报
回复
有空帮你搞搞看

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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