使用treeview控件读数据库动态生成带checkbox复选框的树形导航菜单asp.net(C#),急求帮助还可加分

我不熟悉TreeView控件,但是着急实现如上功能,求大家的帮助哦(好用的代码还可再加分的)详细要求:asp.net(C#)1.件生成树形导航菜单,菜单选项从数据库中提取... 我不熟悉TreeView控件,但是着急实现如上功能,求大家的帮助哦(好用的代码还可再加分的)
详细要求:asp.net(C#)
1.件生成树形导航菜单,菜单选项从数据库中提取,带checkbox复选框,共4级节点。
2.生成树后,选择父节点时其下子节点也选中,选中子节点其父节点也选中,希望获取第四级节点的名称。
数据库的表mymenu如下:
id name pid level
1 中国 0 1
2 山东 1 2
3 山西 1 2
4 烟台 2 3
5 青岛 2 3
6 黄岛区 4 4
7 开发区 4 4
8 美国 0 1
9 省1 8 2
10 市1 9 3
11 区1 10 4
展开
 我来答
百度网友80235d1
推荐于2016-01-25 · 超过20用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:48.8万
展开全部
页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Tree.aspx.cs" Inherits="MyTeachers.web.Tree" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>

<asp:TreeView ID="TreeView1" runat="server" Height="257px" ImageSet="WindowsHelp"
Width="142px" Target="rightFrame">
</asp:TreeView>
</div>
</form>
</body>
</html>

后台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data;

namespace MyTeachers.web
{
public partial class Tree : System.Web.UI.Page
{
DataView dv;
DataTable dt;

protected void Page_Load(object sender, EventArgs e)
{

if (!Page.IsPostBack)
{
int id =Convert.ToInt32(Session["userID"]);
//数据库执行查询的方法就不写了。
//Operator op = new Operator();
//这里执行的是:select * from tabmenu
dt = BLL.tabMenuBLL.GetAlltabMenut(id);
//第一次加载时调用方法传参
CreateTree(0, null, dt, this.TreeView1);

}
}
/// <summary>
/// 创建一个树
/// </summary>
/// <param name="parentID">父ID</param>
/// <param name="node">节点</param>
/// <param name="dt">DataTable</param>
/// <param name="treeView">TreeView的名称</param>
public void CreateTree(int parentID, TreeNode node, DataTable dt, TreeView treeView)
{
//实例化一个DataView dt = 传入的DataTable
dv = new DataView(dt);
//筛选(相当于select * from tabMenu where menuParentID = 传入的 parentID)
dv.RowFilter = "[pid]=" + parentID;

//用foreach遍历dv
foreach (DataRowView row in dv)
{
//第一次加载时为空
if (node == null)
{
//创建根节点
TreeNode root = new TreeNode();
//root.Target = "rightFrame";
//必须与数据库的对应
root.Text = row["menuName"].ToString();
root.Value = row["menuID"].ToString();
//添加根节点
this.TreeView1.Nodes.Add(root);
//递归调用方法本身
CreateTree(int.Parse(row["menuID"].ToString()), root, dt, treeView);
}
else
{
//添加子节点
TreeNode childNode = new TreeNode();
childNode.Text = row["menuName"].ToString();
childNode.Value = row["menuID"].ToString();
childNode.NavigateUrl = row["menuUrl"].ToString();
node.ChildNodes.Add(childNode);
CreateTree(int.Parse(row["menuID"].ToString()), childNode, dt, treeView);
}
}
}
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xrudetj
2011-06-11 · TA获得超过350个赞
知道答主
回答量:314
采纳率:0%
帮助的人:160万
展开全部
我给你的资料不给我100分,是太不够意思,微软的.net控件详解,没有那个比这个更权威的了,我就是看这个出来的。
网址:
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
208vokcwu
2011-06-11 · TA获得超过2168个赞
知道大有可为答主
回答量:4655
采纳率:0%
帮助的人:800万
展开全部
我给你的资料不给我100分,是太不够意思,微软的.net控件详解,没有那个比这个更权威的了,我就是看这个出来的。
网址:
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jjlsky
2011-06-10 · TA获得超过283个赞
知道小有建树答主
回答量:229
采纳率:0%
帮助的人:227万
展开全部
加QQ347832281我发给你源码

private void Bind()
{
string rootStr = "维护";
TreeNode rootNode = new TreeNode(rootStr);
rootNode.Value = "-1";
rootNode.Target = "RightDown";
rootNode.NavigateUrl = "#";
//PopulateTreeView(0, rootNode);
PopulateTreeView1(0, rootNode);
this.tvType.Nodes.Add(rootNode);
}

/// <summary>
/// 最简单的无限级绑定
/// </summary>
/// <param name="parentId"></param>
/// <param name="parentNode"></param>
private void PopulateTreeView1(int parentId, TreeNode parentNode)
{
DataView dv = BySqlHelperQuery.GetClass1("pid=" + parentId.ToString()).DefaultView;
foreach (DataRowView drv in dv)
{
TreeNode myNode = new TreeNode(drv["Name"].ToString());
//myNode.Expanded = false;
myNode.Value = drv["Id"].ToString();
myNode.Target = "RightDown";
//myNode.NavigateUrl = "body.aspx?classId=" + drv["Id"].ToString();
myNode.NavigateUrl = "#";
parentNode.ChildNodes.Add(myNode);
PopulateTreeView1(Convert.ToInt32(drv["Id"].ToString()), myNode);
}
}
js 如下:
//实现你说的checkbox效果
function client_OnTreeNodeChecked(event)
{
//得到当前所 Click 的对象
var objNode;
if(!public_IsObjectNull(event.srcElement))
{
//IE
objNode = event.srcElement;
}
else
{
//FF
objNode = event.target;
}

//判断是否 Click 的 CheckBox
if(!public_IsCheckBox(objNode))
return;

var objCheckBox = objNode;
//根据CheckBox状态进行相应处理
if(objCheckBox.checked==true)
{
//递归选中父节点的 CheckBox
setParentChecked(objCheckBox);

//递归选中所有的子节点
setChildChecked(objCheckBox);
}
else
{
//递归取消选中所有的子节点
setChildUnChecked(objCheckBox);

//递归取消选中父节点(如果当前节点的所有其他同级节点也都未被选中).
setParentUnChecked(objCheckBox);
}
}

//判断对象是否为空
function public_IsObjectNull(element)
{
if(element==null || element == "undefined")
return true;
else
return false;
}

//判断对象是否为 CheckBox
function public_IsCheckBox(element)
{
if(public_IsObjectNull(element))
return false;

if(element.tagName!="INPUT" || element.type!="checkbox")
return false;
else
return true;
}
//得到包含所有子节点的 Node(Div 对象)
function public_CheckBox2Node(element)
{
var objID = element.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("CheckBox"));
return document.getElementById(objID+"Nodes");
}
//得到父节点的 CheckBox
function public_Node2CheckBox(element)
{
var objID = element.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("Nodes"));
return document.getElementById(objID+"CheckBox");
}
//得到本节点所在的 Node(Div 对象)
function public_GetParentNode(element)
{
var parent = element.parentNode;
var upperTagName = "DIV";
//如果这个元素还不是想要的 tag 就继续上溯
while (parent && (parent.tagName.toUpperCase() != upperTagName))
{
parent = parent.parentNode ? parent.parentNode : parent.parentElement;
}
return parent;
}

//设置节点的父节点 Checked
function setParentChecked(currCheckBox)
{
var objParentNode= public_GetParentNode(currCheckBox);
if(public_IsObjectNull(objParentNode))
return;

var objParentCheckBox = public_Node2CheckBox(objParentNode);

if(!public_IsCheckBox(objParentCheckBox))
return;

objParentCheckBox.checked = true;
setParentChecked(objParentCheckBox);
}

//当父节点的所有子节点都未被选中时,设置父节点 UnChecked
function setParentUnChecked(currCheckBox)
{
var objParentNode= public_GetParentNode(currCheckBox);
if(public_IsObjectNull(objParentNode))
return;
//判断 currCheckBox 的同级节点是否都为 UnChecked.
if(!IsMyChildCheckBoxsUnChecked(objParentNode))
return;

var objParentCheckBox = public_Node2CheckBox(objParentNode);

if(!public_IsCheckBox(objParentCheckBox))
return;

objParentCheckBox.checked = false;
setParentUnChecked(objParentCheckBox);
}

//设置节点的子节点 UnChecked
function setChildUnChecked(currObj)
{
var currNode;
if(public_IsCheckBox(currObj))
{
currNode = public_CheckBox2Node(currObj);
if (public_IsObjectNull(currNode))
return;
}
else
currNode = currObj;

var currNodeChilds = currNode.childNodes;
var count = currNodeChilds.length;
for(var i=0;i<count;i++)
{
var childCheckBox = currNodeChilds[i];
if(public_IsCheckBox(childCheckBox))
{
childCheckBox.checked = false;
}
setChildUnChecked(childCheckBox);
}
}

//设置节点的子节点 Checked
function setChildChecked(currObj)
{
var currNode;
if(public_IsCheckBox(currObj))
{
currNode = public_CheckBox2Node(currObj);
if (public_IsObjectNull(currNode))
return;
}
else
currNode = currObj;

var currNodeChilds = currNode.childNodes;
var count = currNodeChilds.length;
for(var i=0;i<count;i++)
{
var childCheckBox = currNodeChilds[i];
if(public_IsCheckBox(childCheckBox))
{
childCheckBox.checked = true;
}
setChildChecked(childCheckBox);
}
}

//判断该节点的子节点是否都为 UnChecked
function IsMyChildCheckBoxsUnChecked(currObj)
{
var retVal = true;

var currNode;
if(public_IsCheckBox(currObj) && currObj.checked == true)
{
return false;
}
else
currNode = currObj;

var currNodeChilds = currNode.childNodes;
var count = currNodeChilds.length;
for(var i=0;i<count;i++)
{
if (retVal == false)
break;
var childCheckBox = currNodeChilds[i];
if(public_IsCheckBox(childCheckBox) && childCheckBox.checked == true)
{
retVal = false;
return retVal;
}
else
retVal = IsMyChildCheckBoxsUnChecked(childCheckBox);
}
return retVal;
}
追问
你的这个回答看起来挺好的,可是我不怎么会用js,所以我借用了楼下的C#版本修改成功了。依然非常感谢您的回答哦~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式