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>
最终效果图:
绑定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>
最终效果图:
相关文章推荐
- ASP.NET树形控件TreeView的递归绑定
- ASP.NET 读数据库绑定到 TreeView 递归方式
- asp.net中TreeView控件的递归呈现方法
- ASP.NET 递归将分类绑定到 TreeView
- ASP.NET 递归将分类绑定到 TreeView
- ASP.NET - 将数据绑定到 TreeView Web 服务器控件
- ASP.NET 读数据库绑定到 TreeView 递归方式
- ASP.NET 递归将分类绑定到 TreeView
- ASP.NET 读数据库绑定到 TreeView 递归方式
- ASP.NET 递归将分类绑定到 TreeView
- ASP.NET中递归绑定DDL下拉控件
- asp.net TreeView递归循环子节点生成树形菜单实例
- TreeView 树形控件 - asp.net
- Asp.net 1.1 Treeview 控件的绑定
- 使用asp.net递归的方法来实现treeview的数据绑定
- TreeView树形控件递归绑定数据库里的数据
- asp.Net 的服务器控件TreeView,级数的绑定方法
- Asp.net用递归方式显示TreeView Web控件的代码
- ASP.NET TreeView 递归绑定数据