TreeView,导航控件,用处大大滴。vs2010自带TreeView,数据绑定,checkbox选择后联动示例,支持各浏览器。
先来个不绑定数据的TreeView:
<asp:TreeView ID="TreeView1" runat="server" ShowLines="True">
<Nodes>
<asp:TreeNode Text="新建节点1" Value="新建节点">
<asp:TreeNode Text="新建节点1-1" Value="新建节点1-1"></asp:TreeNode>
<asp:TreeNode Text="新建节点1-2" Value="新建节点1-2"></asp:TreeNode>
</asp:TreeNode>
<asp:TreeNode Text="新建节点2" Value="新建节点2">
<asp:TreeNode Text="新建节点2-1" Value="新建节点2-1">
<asp:TreeNode Text="新建节点2-1-1(打开布布分享)" Value="新建节点2-1-1" NavigateUrl="http://tech.bubufx.com/"
Target="_blank"></asp:TreeNode>
<asp:TreeNode Text="新建节点2-1-2(js脚本)" Value="新建节点2-1-2" NavigateUrl="javascript:alert(’hello!’);">
</asp:TreeNode>
</asp:TreeNode>
<asp:TreeNode Text="新建节点2-2" Value="新建节点2-2" ShowCheckBox="true"></asp:TreeNode>
</asp:TreeNode>
</Nodes>
</asp:TreeView>
业务系统,TreeView是最常用的控件。带checkbox,选择上一级节点,子节点全部选中,选中子节点,上级也选中,且联动无刷新。下面的例子可以直接复制到新建的页面内运行。
图示:

bubufx_treeview.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="bubufx_treeview.aspx.cs"
Inherits="bubufx_treeview" %>
<!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>
<script type="text/javascript" language="javascript">
function postBackByObject(event) {
var o = (window.event) ? window.event.srcElement : event.target;
if (o.nodeName == "INPUT" && o.type == "checkbox") {
__doPostBack("", "");
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TreeView ID="TreeView2" runat="server" ShowLines="True" ShowCheckBoxes="All"
OnTreeNodeCheckChanged="TreeView2_TreeNodeCheckChanged">
</asp:TreeView>
<asp:Button ID="Button1" runat="server" Text="获得选中" onclick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</div>
</form>
</body>
</html>
bubufx_treeview.aspx.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
public partial class bubufx_treeview : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//
TreeView2.EnableClientScript = true;
TreeView2.Attributes.Add("onclick", "postBackByObject(event)");
//
if (!Page.IsPostBack)
{
string sql = "";
string connstr = System.Configuration.ConfigurationManager.AppSettings["DataSQL"];
DB cDB = new DB();
sql = "select * from mztree";
DataTable DT = cDB.RunSQLGetDT(sql, connstr);
if (DT.Rows.Count > 0)
{
nodeBinding(TreeView2, DT, "0", null);
}
}
}
public void nodeBinding(TreeView _treeView, DataTable _dt, string _filter, TreeNode _pNode)
{
//循环构建树
string sFilter = "pid=" + _filter;
TreeNode parentNode = _pNode;
DataView dv = new DataView(_dt);
dv.RowFilter = sFilter;
if (dv.Count > 0)
{
foreach (DataRowView drv in dv)
{
TreeNode tempNode = new TreeNode();
tempNode.Text = drv["name"].ToString();
tempNode.Value = drv["ID"].ToString();
//tempNode.NavigateUrl = "bubufx_tech.aspx?c=" + drv["ID"].ToString();
//tempNode.Target = "bubufxIframe";
if (parentNode != null)
parentNode.ChildNodes.Add(tempNode);
else
_treeView.Nodes.Add(tempNode);
nodeBinding(_treeView, _dt, drv["ID"].ToString(), tempNode);
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string str = getCheckedNodeValue(TreeView2.Nodes,",");
Label1.Text = str;
}
public string getCheckedNodeValue(TreeNodeCollection aNodes,string chuan)
{
string str = "";
for (int i = 0; i < aNodes.Count; i++)
{
if (aNodes[i].Checked == true)
{
str = str + aNodes[i].Value + chuan;
}
if (aNodes[i].ChildNodes.Count > 0)
{
str = str + getCheckedNodeValue(aNodes[i].ChildNodes, chuan);
}
}
return str;
}
protected void TreeView2_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
RecursiveCheckCheckBox(e.Node, e.Node.Checked, true);
TreeNode current = e.Node;
while (!current.Checked && current.Parent != null && !IsChildNodesChecked(current.Parent))
{
current.Parent.Checked = false;
current = current.Parent;
}
if (e.Node.Checked)
{
RecursiveCheckCheckBox(e.Node, e.Node.Checked, false);
}
}
private bool IsChildNodesChecked(TreeNode n)
{
bool result = false;
if (n.ChildNodes.Count == 0)
{
result = n.Checked;
}
foreach (TreeNode t in n.ChildNodes)
{
if (result |= t.Checked)
{
break;
}
}
return result;
}
private void RecursiveCheckCheckBox(TreeNode n, bool isChecked, bool topDown)
{
if (topDown)
{
foreach (TreeNode l in n.ChildNodes)
{
l.Checked = isChecked;
if (l.ChildNodes.Count != 0)
{
RecursiveCheckCheckBox(l, isChecked, topDown);
}
}
}
else
{
n.Checked = isChecked;
if (n.Parent != null)
{
RecursiveCheckCheckBox(n.Parent, isChecked, false);
}
}
}
}