下面的数据是自动生成的,生成树形菜单,如果我要在数据库读取数据,ID,parentID,Name,该怎么改呢?private DataTable GetAllDatas()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("ParentID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns[0].AutoIncrement = true;
dt.Columns[0].AutoIncrementSeed = 1; CreateChild(dt, 0, 2); return dt;
} /// <summary>
/// 生成节点的子孙节点
/// </summary>
/// <param name="dt"></param>
/// <param name="parentId"></param>
/// <param name="curLevel"></param>
private void CreateChild(DataTable dt, int parentId, int curLevel)
{
curLevel--;
if (curLevel >= 0)
{
for (int i = 0; i < 4; i++)
{
DataRow dr = dt.NewRow();
dr[1] = parentId;
dr[2] = String.Format("Tree Item_{0}", dt.Rows.Count);
dt.Rows.Add(dr); CreateChild(dt, dt.Rows.Count, curLevel);
}
}
}
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("ParentID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns[0].AutoIncrement = true;
dt.Columns[0].AutoIncrementSeed = 1; CreateChild(dt, 0, 2); return dt;
} /// <summary>
/// 生成节点的子孙节点
/// </summary>
/// <param name="dt"></param>
/// <param name="parentId"></param>
/// <param name="curLevel"></param>
private void CreateChild(DataTable dt, int parentId, int curLevel)
{
curLevel--;
if (curLevel >= 0)
{
for (int i = 0; i < 4; i++)
{
DataRow dr = dt.NewRow();
dr[1] = parentId;
dr[2] = String.Format("Tree Item_{0}", dt.Rows.Count);
dt.Rows.Add(dr); CreateChild(dt, dt.Rows.Count, curLevel);
}
}
}
TreeView控件可以通过递归方式绑定数据库数据,代码如下:
void Page_Load()
{
if (!Page.IsPostBack)
PopulateTreeView();
}
private void PopulateTreeView()
{
DataTable treeViewData = http://www.cnblogs.com/zhouhb/archive/2012/02/11/GetTreeViewData();
AddTopTreeViewNodes(treeViewData); //绑定父节点
}
private DataTable GetTreeViewData() //获取数据
{
string selectCommand = "SELECT MessageId,ParentId,Subject FROM Discuss";
string conString = WebConfigurationManager.ConnectionStrings["Discuss"].ConnectionString;
SqlDataAdapter dad = new SqlDataAdapter(selectCommand, conString);
DataTable dtblDiscuss = new DataTable();
dad.Fill(dtblDiscuss);
return dtblDiscuss;
}
private void AddTopTreeViewNodes(DataTable treeViewData)
{
DataView view = new DataView(treeViewData);
view.RowFilter = "ParentID IS NULL";
foreach (DataRowView row in view)
{
TreeNode newNode = new TreeNode(row["Subject"].ToString(), row["MessageId"].ToString());
TreeView1.Nodes.Add(newNode);
AddChildTreeViewNodes(treeViewData, newNode);//绑定子节点
}
}
private void AddChildTreeViewNodes(DataTable treeViewData, TreeNode parentTreeViewNode)
{
DataView view = new DataView(treeViewData);
view.RowFilter = "ParentID=" + parentTreeViewNode.Value;
foreach (DataRowView row in view)
{
TreeNode newNode = new TreeNode(row["Subject"].ToString(), row["MessageId"].ToString());
parentTreeViewNode.ChildNodes.Add(newNode);
AddChildTreeViewNodes(treeViewData, newNode);//递归,绑定子节点
}
}
数据表中记录通过ParentId字段指定父节点。
详细介绍可以参考:《ASP.NET2.0揭秘卷1》
树节点TreeNode的重要属性:
Text:节点显示内容
Value:节点对应值
NavigateUrl:导航页面Url
Target:目标框架
ImageUrl:节点图像页面扔一个treeview控件
比如:
首先定义个所有树数据的dt(id name parentid);
首先获取所有的父节点(select * from table where parentid=0)=>dtFirst,
再foreach(dtFirst),填充到dt,调用getChildsByLevel(parentid,level)也填充到dt
getChildsByLevel(parentid,level)这是个递归方法即里面会循环递归调用自己获得数据 返回dt
这样就会得到所有的数据已树的形式.当然也你可以直接考虑直接写一个递归方法 然后返回数据其实没必要自己去写这种拉 还是使用treeview控件 或者第三方控件比如(zTree) 只要给他id parentid他则会自己给你生成树.