- 热门文章:
- · DotNetNuke(DNN)
- · 枚举器模式(Enumerator pattern)
- · 用ASP.NET 1.1 新特征防止Script攻击
- · 关于ASP.Net中的时间处理
- · javascript实现的数据表格:冻结列、调整列宽和客户端排序
- · [常见问题]cookie使用1.Page与HttpContext的Request、Response
- · 怎样在页面和页面的用户控件进行交互
- · webform页面间传值的特殊方法
- · 怎么直接建立一个DataTable并且为之添加数据
- · 我的第一个Asp.Net程序
- · 如何把数据放到web不能访问的文件夹中并给用户下载?
- · How to handle the concurrency problems on ASP.Net Database
上一篇:使用Control.Invoke处理多线程应用程序界面 >>
WEB页面TreeView的应用-(得到所有选中的节点)
在WEB的TreeView中可以使用CheckBox来设置TreeView的节点是否可以选中,是大家都知道的。我们在项目进程中也用到该方法,这里把具体实现的方法给出。希望大家有更好的方案提出。
先制定节点选择的规则:
子节点选中,自动添加父节点到记录中;父节点选中,但子节点未选中的,仅仅添加父节点。
实现的代码,C#代码页面如下:
###################################
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Microsoft.Web.UI.WebControls;
using IDAL;
using ClassI;
namespace MSTreeView
{
/// <summary>
/// WebForm1
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Button Button1;
protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
protected System.Web.UI.WebControls.Button Button2;
protected System.Web.UI.WebControls.DropDownList DropDownList1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
DataTable dt=new DataTable();
dt=this.GetDataSource();
Session["dt"]=dt;
BoundTreeview(this.TreeView1.Nodes,0);
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private DataTable GetDataSource()
{
DataTable dt=new DataTable("dt");
dt.Columns.Add(new DataColumn("ID",typeof(System.Int32)));
dt.Columns.Add(new DataColumn("PID",typeof(System.Int32)));
dt.Columns.Add(new DataColumn("NUM",typeof(System.Int32)));
dt.Columns.Add(new DataColumn("NAME",typeof(System.String)));
// for (int i=0;i<=10;i++)
// {
DataRow dr;
dr=dt.NewRow();
dr["ID"]=1;
dr["PID"]=0;
dr["NUM"]=1;
dr["NAME"]="1";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=2;
dr["PID"]=1;
dr["NUM"]=2;
dr["NAME"]="2";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=3;
dr["PID"]=1;
dr["NUM"]=5;
dr["NAME"]="ID3";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=4;
dr["PID"]=0;
dr["NUM"]=2;
dr["NAME"]="ID4";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=5;
dr["PID"]=4;
dr["NUM"]=1;
dr["NAME"]="ID5";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=6;
dr["PID"]=0;
dr["NUM"]=3;
dr["NAME"]="ID6";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=7;
dr["PID"]=0;
dr["NUM"]=1;
dr["NAME"]="ID7";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=8;
dr["PID"]=7;
dr["NUM"]=1;
dr["NAME"]="ID8";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=9;
dr["PID"]=8;
dr["NUM"]=1;
dr["NAME"]="ID9";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=10;
dr["PID"]=8;
dr["NUM"]=2;
dr["NAME"]="ID10";
dt.Rows.Add(dr);
dr=dt.NewRow();
dr["ID"]=11;
dr["PID"]=7;
dr["NUM"]=2;
dr["NAME"]="ID11";
dt.Rows.Add(dr);
// }
return dt;
}
///此处使用递归绑定TreeView的数据
private void BoundTreeview(TreeNodeCollection TreeNodes ,int ParentID)
{
DataTable dt=new DataTable();
dt=(DataTable)Session["dt"];
DataView treeDV = new DataView();
int treeId;
TreeNode treeTemp;
string treeName;
treeDV.Table = dt;
treeDV.RowFilter = "ID<>@#" + ParentID + "@# and PID=@#" + ParentID + "@#";
treeDV.Sort="NUM";
foreach(DataRowView treeDVrow in treeDV)
{
treeTemp=new TreeNode();
treeName = treeDVrow["NAME"].ToString();
treeId = Convert.ToInt32(treeDVrow["ID"].ToString());
treeTemp.ID = treeId.ToString();
treeTemp.Text = treeName;
treeTemp.CheckBox=true;
treeTemp.Expanded=true;
TreeNodes.Add(treeTemp);
BoundTreeview(TreeNodes[TreeNodes.Count - 1].Nodes, treeId);
}
}
///递归TreeView,把所有被选中的节点ID记录到HashTable中
private void RecursiveTree(TreeView tree,ref Hashtable allID )
{
TreeNodeCollection nodes = tree.Nodes;
foreach (TreeNode n in nodes)
{
RecursiveNodes(n,ref allID);
AddCheckedID(n,ref allID);
}
}
///递归TreeView的节点,把所有被选中的节点ID记录到HashTable中
private void RecursiveNodes(TreeNode node,ref Hashtable allID)
{
foreach (TreeNode tn in node.Nodes)
{
RecursiveNodes(tn,ref allID);
AddCheckedID(tn,ref allID);
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Hashtable aaa=new Hashtable();
RecursiveTree(this.TreeView1,ref aaa);
}
///把被选中的节点的父节点ID记录到HashTable中
private void AddParentID(TreeNode node,ref Hashtable allID)
{
try
{
TreeNode pnode=(TreeNode)node.Parent;
AddParentID(pnode,ref allID);
AddIdToHashTable(Convert.ToInt32(pnode.ID),ref allID);
}
catch
{
}
}
///把所有被选中的节点ID和其父节点ID记录到HashTable中
private void AddCheckedID(TreeNode node,ref Hashtable allID )
{
if(node.Checked)
{
string strvalue=node.ID.ToString();
int i=Convert.ToInt32(node.ID);
try
{
AddParentID(node,ref allID);
}
catch
{
}
AddIdToHashTable(i,ref allID);
}
}
///把所有被选中的节点ID记录到HashTable中,如果ID已经存在,则不添加
private void AddIdToHashTable(int nodeID,ref Hashtable allID)
{
if(!allID.ContainsKey(nodeID))
{
allID.Add(nodeID,nodeID.ToString());
}
}
private void Button2_Click(object sender, System.EventArgs e)
{
Hashtable aaa=new Hashtable();
if(Session["aaa"]!=null) aaa=(Hashtable)Session["aaa"];
Session["aaa"]=aaa;
}
}
}
###################################
个人感觉这种实现的方式不是最好的,但是项目进度决定了没有太多时间来考量算法和其他实现放松。希望其他网友有更好的方案,大家共享!
下一篇:DotNetNuke(DNN) >>
相关文章:
- · 后台动态设置前台标签内容和属性
- · ASP.NET中让同一个页面不同的文本框回车响应不同的事件
- · 认识ASP.NET配置文件Web.config
- · 将ArrayList中的ListItem绑定到DropDownList中去
- · 安全存放web项目数据库连接字符串
- · 分享:Project级别的权限控制
- · Solidworks二次开发—06—在装配体中添加配合
- · 在Repeater中嵌套使用Repeater
- · 一个简单的加密/解密方法
- · 加入身份验证信息的SMTP mail发送
- · webconfig的设置节点说明
- · 现有的Web打印控制技术分成几种方案
- · 一段实现DataGrid的“编辑”、“取消”功能脚本[无刷新]
- · WEB图片高清晰浏览同打印
- · Tangram与软件的组合构造
- · solidworks二次开发-04-修改数据
- · Solidworks二次开发-05-装配体中插入零部件
- · solidworks二次开发-03-访问特征数据
- · solidworks二次开发-02-用来访问特征的两个API
- · solidworks二次开发-01-录制一个宏
- · 有关于web播放器的列表播放问题
- · Microsoft User Interface Process Application Block 研究(3)
- · ASP.NET中使用IFRAME建立类Modal窗口
- · 挤压造型Extrusion的节点说明和应用实例
- · .net 里面 protected private 的变量也可以访问
- · 怎样得到一个系统盘的全名,不是字符,是全名,如:本地磁盘(C:)?
- · ASP.NET中新的代码编译功能(三)
- · ASP.NET中新的代码编译功能(二)
- · ASP.NET中新的代码编译功能(一)
- · asp.net里,一个小的自定义错误显示
- · ASP.NET编程中的十大技巧
- · 在ASP.NET中面向对象的编程思想
- · 有史以来最牛B的.NET程序集加密方法?
- · 在ASP.NET中实现多文件上传
- · (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
- · (论坛答疑点滴)有的时候DataGrid取值取不到?
- · (论坛答疑点滴)联合主键的情况怎么在DataGrid中利用DataKeys定位记录?
- · (论坛答疑点滴)__doPostBack()无效?
