动态菜单树实现方式
开始一直在考虑用javascript和xml自己写,也就是炒作的比较厉害的AJAX。但是谈何容易。根据.net面向控件的特点,首先要想得是在网上找有这个功能的控件,微软的treeview是比较好的了。要用的话当然也需要写一些代码,大体是把节点读取到dataset中,由于datasets支持XML,可能要把数据映射到XML数据文件中去。
辛苦了一天,终于把昨天的问题解决了,实现了动态读取数据库某张表中的节点,然后动态生成节点,形成动态树的问题。感谢第三方控件。
首先,建好一张表。如下图:
代码如下:
public class testTree : System.Web.UI.Page
{
protected Telerik.WebControls.RadTreeView RadTreeView1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
this.GenerateTreeView();
}
}
private void GenerateTreeView()
{
OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["news"]);
conn.Open();
string sql = "select * from treeview";
OracleDataAdapter adapter = new OracleDataAdapter(sql,conn);
DataSet ds = new DataSet();
adapter.Fill(ds);
ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["id"], ds.Tables[0].Columns["parentId"]);
foreach(DataRow dbRow in ds.Tables[0].Rows)
{
if(dbRow.IsNull("parentId"))
{
RadTreeNode node = CreateNode(dbRow["Text"].ToString(), true);
this.RadTreeView1.AddNode(node);
RecursivelyPopulate(dbRow, node);
}
}
}
private void RecursivelyPopulate(DataRow dbRow, RadTreeNode node)
{
foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
{
RadTreeNode childNode = CreateNode(childRow["Text"].ToString(), true);
node.AddNode(childNode);
RecursivelyPopulate(childRow, childNode);
}
}
private RadTreeNode CreateNode(string text, bool expanded)
{
RadTreeNode node = new RadTreeNode(text);
node.Expanded = true;
return node;
}
最后结果: