您的位置:首页 > 编程语言 > ASP

ASP.NET树形控件TreeView的递归绑定

2013-01-24 15:25 423 查看
用递归绑定TreeView,数据库表设计的时候必不可少的2个字段分别是NodeId和ParentId,其中NodeId是用来标识节点本身的,ParentId是父节点的ID,如下图(记住第一个节点的NodeId不能为0,父节点的ID为0,不然会出现死循环)



绑定TreeView的代码:

[c-sharp] view
plaincopy

DataTable table1 = new DataTable();

DataTable dt = new DataTable();

protected void Page_Load(object sender, EventArgs e)

{

Response.Cache.SetNoStore();

if (!IsPostBack)

{

sys_treemenuApp bll = new sys_treemenuApp();

DataSet set2 = bll.GetList("");

table1 = set2.Tables[0];//给table1赋值

this.InitTree(this.TreeView1.Nodes, "0");

this.TreeView1.Attributes.Add("OnClick", "postBackByObject()");//执行JS,为了选择节点后能返回后台处理

this.TreeView1.ExpandAll();

}

}

//递归生成树

private void InitTree(TreeNodeCollection Nds, string parentId)

{

DataView view1 = new DataView();

DataView view2 = new DataView();

DataSet set1 = new DataSet();

view1.Table = table1;

view2.Table = table1;

view1.RowFilter = "ParentId='" + parentId + "'";

Admin_UserrightApp bll = new Admin_UserrightApp();

DataSet ds = bll.GetList(" userid=" + Request["id"].ToString() + "");//获取登录用户拥有的权限,拥有权限的节点为选中状态

foreach (DataRowView view3 in view1)

{

TreeNode node1 = new TreeNode();

node1.Expanded = false;

node1.Value = view3["NodeId"].ToString();

node1.Text = view3["NodeName"].ToString();

node1.ImageUrl = view3["Icon"].ToString();

node1.NavigateUrl = view3["Address"].ToString() + "?NodeId=" + view3["NodeId"].ToString();

node1.Target = "mainwindow";

for(int i=0;i<ds.Tables[0].Rows.Count;i++)//绑定节点是否为选中状态,这里又一个循环,感觉效率不高,有什么更好的方法望指教

{

if(node1.Value.ToString() ==ds.Tables[0].Rows[i]["NodeId"].ToString())

{

node1.Checked = true;

}

}

Nds.Add(node1);

string text1 = view3["NodeId"].ToString();

view2.RowFilter = "ParentId='" + text1 + "'";

if (view3["NodeId"].ToString() != "0")

{

this.InitTree(node1.ChildNodes, node1.Value.ToString());//递归调用

}

}

}

//子节点有选中的,父节点默认选中

protected void TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)

{

//bool check=false;

if (e.Node.Checked == true)

{

if (e.Node.Parent != null)

{

e.Node.Parent.Checked = true;

}

}

}

}

JS代码:

[xhtml] view
plaincopy

<mce:script type="text/javascript"><!--

function postBackByObject()

{

var obj = window.event.srcElement;

if(obj.tagName == "INPUT" && obj.type == "checkbox")

{

__doPostBack("","");

}

}

// --></mce:script>

最终效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: