asp.net treeview 总结
网上关于Treeview的代码虽然多 但是都是很乱 实用性和正确性也不是很好 只好自己写一套了,时间比较紧张 性能可能还需调整
以用户组织的一个实际例子来讲诉Treeview的用法吧
组织表结构:
用户组织表结构:
前台界面aspx
<form id="Form1" runat="server">
<table> <tr>
<td class="contentTD">
<div id="MyTreeDiv">
<asp:TreeView ShowCheckBoxes="All" ID="MyTreeView" ImageSet="Contacts" runat="server" ExpandDepth="" Width="400px" BorderStyle="Solid" BorderWidth="1px">
</asp:TreeView>
</div>
</td>
</tr>
<tr> <td class="content">
<asp:Button ID="btnSubmit" runat="server" Text="提 交" CssClass="dotNetButton" OnClick="btnSubmit_Click" /><input type="button" class="glbutton" onclick="history.go(-1);"
value="返 回" />
<asp:ListBox ID="ListBox1" Visible="false" runat="server"></asp:ListBox>
</td>
</tr>
</table>
</form>
js控制父节点选中子节点自动选中
<script>
function Davidovitz_HandleCheckbox() {
var element = event.srcElement;
if (element.tagName == "INPUT" && element.type == "checkbox") {
var checkedState = element.checked;
while (element.tagName != "TABLE") // Get wrapping table
{
element = element.parentElement;
} Davidovitz_UnCheckParents(element); // Uncheck all parents element = element.nextSibling; if (element == null) // If no childrens than exit
return; var childTables = element.getElementsByTagName("TABLE");
for (var tableIndex = ; tableIndex < childTables.length; tableIndex++) {
Davidovitz_CheckTable(childTables[tableIndex], checkedState);
}
}
} // Uncheck the parents of the given table, Can remove the recurse (redundant)
function Davidovitz_UnCheckParents(table) {
if (table == null || table.rows[].cells.length == ) // This is the root
{
return;
}
var parentTable = table.parentElement.previousSibling;
Davidovitz_CheckTable(parentTable, false);
Davidovitz_UnCheckParents(parentTable);
} // Handle the set of checkbox checked state
function Davidovitz_CheckTable(table, checked) {
var checkboxIndex = table.rows[].cells.length - ;
var cell = table.rows[].cells[checkboxIndex];
var checkboxes = cell.getElementsByTagName("INPUT");
if (checkboxes.length == ) {
checkboxes[].checked = checked;
}
} </script>
后台代码.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.MyTreeView.Attributes.Add("onclick", "Davidovitz_HandleCheckbox()"); bind();
}
}
//数据绑定
private void bind()
{
this.MyTreeView.Nodes.Clear();
//读取组织列表
DataTable dt = new T_GroupManager().GetDataTableBySQL(" and FState=1 and FCreatorID = " + Request.QueryString["id"]); this.ViewState["ds"] = dt;
//调用递归函数,完成树形结构的生成
AddTree(, (TreeNode)null); if (Request.QueryString["id"] != null)
{
//根据用户ID查找对应的用户组织结构,勾上
List<T_UserGroup> list = new T_UserGroupManager().GetAllBySQL(" and FUSerID=" + Request.QueryString["id"]).ToList();
ViewState["UserGroup"] = list;
foreach (T_UserGroup item in list)
{
for (int i = ; i < this.MyTreeView.Nodes.Count; i++)
{
if (MyTreeView.Nodes[i].ChildNodes.Count > ) //判断是否还有子节点
{
SetNode(MyTreeView.Nodes[i]);
}
if (MyTreeView.Nodes[i].Value == item.FGroupID.ToString()) //判断是否被选中
{
MyTreeView.Nodes[i].Checked = true;
}
}
}
}
}
//查找子节点
public void SetNode(TreeNode node)
{
if (Request.QueryString["id"] != null)
{
//根据ID查找对应的组织结构,勾上
List<T_UserGroup> list = ViewState["UserGroup"] as List<T_UserGroup>;
foreach (T_UserGroup item in list)
{
for (int i = ; i < node.ChildNodes.Count; i++)
{
if (node.ChildNodes[i].ChildNodes.Count > ) //判断是否还有子节点
{
SetNode(node.ChildNodes[i]); //递归查找
}
if (node.ChildNodes[i].Value == item.FGroupID.ToString()) //判断是否被选中
{
node.ChildNodes[i].Checked = true;
}
}
}
}
} //递归添加树的节点
public void AddTree(int ParentID, TreeNode pNode)
{
DataTable ds = (DataTable)this.ViewState["ds"];
DataView dvTree = new DataView(ds);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[FParentUserID] = " + ParentID; foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null)
{
//添加根节点
Node.Text = Row["FGroupName"].ToString();
Node.Value = Row["PID"].ToString();
this.MyTreeView.Nodes.Add(Node);
Node.Expanded = true;
//再次递归
AddTree(Int32.Parse(Row["PID"].ToString()), Node);
}
else
{
//添加当前节点的子节点
Node.Text = Row["FGroupName"].ToString();
Node.Value = Row["PID"].ToString();
pNode.ChildNodes.Add(Node);
Node.Expanded = true;
//再次递归
AddTree(Int32.Parse(Row["PID"].ToString()), Node);
}
}
}
/// <summary>
/// 保存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSubmit_Click(object sender, EventArgs e)
{
for (int i = ; i < MyTreeView.Nodes.Count; i++)
{
if (MyTreeView.Nodes[i].ChildNodes.Count > ) //判断是否还有子节点
{
GetNode(MyTreeView.Nodes[i]);
}
if (MyTreeView.Nodes[i].Checked == true) //判断是否被选中
{
string s = MyTreeView.Nodes[i].Value.ToString();
ListBox1.Items.Add(s);
}
}
T_UserGroupManager gm = new T_UserGroupManager();
//清空
List<T_UserGroup> list = ViewState["UserGroup"] as List<T_UserGroup>;
foreach (T_UserGroup item in list)
{
gm.DeleteByPID(item.PID);
}
int id = Convert.ToInt32(Request.QueryString["id"]);
//保存
foreach (var item in ListBox1.Items)
{
T_UserGroup ug = new T_UserGroup();
ug.FUSerID = id;
ug.FGroupID = Convert.ToInt32((item as ListItem).Value);
ug.FState = ;
gm.Add(ug);
}
ShowJS("<script>alert('保存成功!');location = 'UserGroupInfo.aspx'</script>");
}
//获取选中节点
public void GetNode(TreeNode node)
{
for (int i = ; i < node.ChildNodes.Count; i++)
{
if (node.ChildNodes[i].ChildNodes.Count > ) //判断是否还有子节点
{
GetNode(node.ChildNodes[i]); //递归查找
}
if (node.ChildNodes[i].Checked == true) //判断是否被选中
{
string s = node.ChildNodes[i].Value.ToString();
ListBox1.Items.Add(s);
}
}
}
}
基本上面就是全部代码了,实现了Treeview的读取和根据勾选保存,根据用户配置设置Treeview的勾选项
用了好一段时间才整理出来的,要转载的童鞋记得保留我的链接哦http://www.cnblogs.com/linyijia/p/3497503.html
asp.net treeview 总结的更多相关文章
- asp .Net TreeView实现数据绑定和事件响应
最近做了一个图书馆管理系统,其中要实现中图法分类号查询,因为初学asp ,感觉还有点难度, 第一步:数据库文件 第二步 向界面中拖进TreeView控件 第三步添加事件 下面是cs文件代码 //Tre ...
- asp 使用TreeView控件
这段代码为了使用 TreeNodeCheckChanged 事件,会有回刷新的效果: 不喜欢的可查看改进版,利用js控制选择操作,无界面刷新, “http://www.cnblogs.com/GoCi ...
- asp.net treeview 异步加载
在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载TreeView. 在Tre ...
- ASP.NET - TreeView 增删
效果: 前端代码: <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Si ...
- ASP.NET - TreeView
设置节点图片 : Windows资源管理器左侧的树型资源结构图中,各节点都有图片连接,例如磁盘的图片.光盘的图片和文件夹的图片等,使资源的表现更加形象.IEWebControls的TreeView控件 ...
- 转:asp.net TreeView CheckChanged 事件浅谈
http://blog.csdn.net/xiage/article/details/5128755 在开发中经常可以碰到类似的问题: 想通过一个树父节点的TreeNodeCheckChanged 事 ...
- asp.net TreeView控件绑定数据库显示信息
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- asp.net TreeView与XML配合使用v1.1
刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...
- ASP.NET - TreeView控件,只操作最后一级节点
效果: 使用母板页进行,左右页面进行跳转. 绑定TreeView控件:http://www.cnblogs.com/KTblog/p/4792302.html 主要功能: 点击节点的时候,只操作最后一 ...
随机推荐
- JWT token心得
token的组成 token串的生成流程. token在客户端与服务器端的交互流程 Token的优点和思考 参考代码:核心代码使用参考,不是全部代码 JWT token的组成 头部(Header),格 ...
- Java学习笔记七(目录操作)
1.介绍 上一篇博客介绍的是java中经常使用的操作文件的方式,本篇博客着重解说一下,在Java中是怎样来操作目录的.主要是利用的是Java.IO包以下的File类,本篇博客着重解说一下该类的构造函数 ...
- ShareSDK for Android 2.3.10已经公布
ShareSDK for Android 2.3.10已经公布,本次更新内容包含: 1.加入自己定义分享标签功能 新版本号SDK下载页面地址: http://share.sharesdk.cn/Dow ...
- PHP如何安装和配置Zend Studio
1 网上下载该软件,安装之后关闭三个东西 2 新建一个本地的PHP项目 3 展开左侧的资源树,发现多了一个PHP的相关东西 4 右击"基础知识",新建一个PHP文件并输入以下代码 ...
- Struts完美解决i18n问题
所谓的i18n问题指的是(软件的)国际化问题,简单来讲就是使我们的软件可以让世界使用任何语言的人们都能使用,软件自身会根据语言环境的不同进行自动配置,如果你是中文环境那界面以中文显示,如果是英文环境就 ...
- LeetCode-344:Reverse String
This is a "Pick One" Problem :[Problem:344-Reverse String] Write a function that takes a ...
- CRC文件解压缩问题
CRC问题一般有三种可能1.你的硬盘出现坏道2.你的硬盘数据线受损3.还可能是主板和内存的问题 硬盘坏道的表现硬盘使用久了就可能出现各种各样的问题,而硬盘“坏道”便是这其中最常见的问题.硬盘出现坏道除 ...
- Solr之困
http://www.kafka0102.com/2010/08/319.html重写公司的站内搜索.经过前期一段时间对lucene和solr的熟悉,最后决定使用Solr作为新系统的基础框架.现在已经 ...
- Python装饰器(Decorator)简介
Python有许多出色的语言特性,装饰器(Decorator)便是其中一朵奇葩.先来看看一段代码: def deco1(f): print 'decorate 1' return f def deco ...
- script标签的crossorigin属性
通常我们使用window.onerror来捕获js脚本的错误信息. 但是对于跨域调用的js脚本,onerror事件只会给出很少的报错信息:error: Script error. 这个简单的信息很明显 ...