TreeView 控件树节点 TreeNode 的异步加载及对节点 CHECKBOX 的多选控制
2006-06-27 09:38
537 查看
代码目标:以树型表达组织单位和下属用户的层次结构关系,并允许通过CHECKBOX多选组织和/或用户
其他需求:组织单位总数约三千个,用户总数约四万人。
环境:.NET Framework 1.1
IDE:Visual Studio.NET 2003
1. OrgXMLCreator.aspx 是一个空白的 Web 窗体
OrgXMLCreator.aspx.cs 目的是生成组织节点,内容片段如下:
private void Page_Load(object sender, System.EventArgs e)
{
string orgID = Request.QueryString["oid"].ToString().Trim();
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
if(orgID.Length >0 )
{
Response.Write (CreateXml(orgID));
}
Response.End();
}
public string CreateXml(string orgID)
{
StringBuilder sb = new StringBuilder();
//sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n");
sb.Append("<TREENODES>\r\n");
if(orgID!="0")
{
// ======== inner node ================
// set attribute NodeData to userid
sb.Append("<TreeNode NodeData=\"");
sb.Append("0");
// set attribute Text to zhname
sb.Append("\" Text=\"");
sb.Append("直属用户");
sb.Append("\" ");
// set other attributes
sb.Append(" Checkbox=\"false\" Type=\"None\" Expanded=\"true\" ");
sb.Append(" TreeNodeSrc=\"UserXMLCreator.aspx?oid="); // 直属用户的立即异步加载
sb.Append(orgID);
sb.Append("\" ");
sb.Append(">\r\n");
sb.Append("</TreeNode>");
// ====================================
}
DataTable dt = new DataTable();
dt = DataProvider.Instance.GetChildOrg(orgID).Tables[0];
sb.Append(CreateList(dt));
sb.Append("</TREENODES>");
return sb.ToString();
}
protected string CreateList(DataTable dt)
{
StringBuilder sb = new StringBuilder();
try
{
DataRow[] drs = dt.Select("1=1", "Showorder");
foreach(DataRow dr in drs)
{
sb.Append(CreateElement(dr));
}
return sb.ToString();
}
catch
{
return "";
}
}
protected string CreateElement(DataRow dr)
{
StringBuilder sb = new StringBuilder();
string id = dr["id"].ToString();
// set attribute NodeData to userid
sb.Append("<TreeNode NodeData=\"");
sb.Append(id);
// set attribute Text to zhname
sb.Append("\" Text=\"");
sb.Append(dr["name"].ToString());
sb.Append("\" ");
// set other attributes
if(dr["hasPermission"].ToString().Equals("1"))
{
sb.Append(" Checkbox=\"true\" Type=\"OU\" Expanded=\"false\" ");
}
else
{
sb.Append(" Checkbox=\"false\" Type=\"OU\" Expanded=\"false\" ");
}
sb.Append(" TreeNodeSrc=\"OrgXMLCreator.aspx?oid="); // 子组织的延迟异步加载
sb.Append(id);
sb.Append("\" ");
sb.Append(">\r\n");
sb.Append("</TreeNode>");
return sb.ToString();
}
2. UserXMLCreator.aspx 是一个空白的 Web 窗体
UserXMLCreator.aspx.cs 目的是生成用户节点,内容片段如下:
private void Page_Load(object sender, System.EventArgs e)
{
string orgID = Request.QueryString["oid"].ToString().Trim();
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
if(orgID.Length >0 )
{
Response.Write (CreateXml(orgID));
}
Response.End();
}
public string CreateXml(string orgID)
{
StringBuilder sb = new StringBuilder();
//sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n");
sb.Append("<TREENODES>\r\n");
DataTable dt = new DataTable();
dt = DataProvider.Instance.GetUsersInOrganization(orgID).Tables[0];
sb.Append(CreateList(dt));
sb.Append("</TREENODES>");
return sb.ToString();
}
protected string CreateList(DataTable dt)
{
StringBuilder sb = new StringBuilder();
try
{
DataRow[] drs = dt.Select();
foreach(DataRow dr in drs)
{
sb.Append(CreateElement(dr));
}
return sb.ToString();
}
catch
{
return "";
}
}
protected string CreateElement(DataRow dr)
{
StringBuilder sb = new StringBuilder();
string id = dr["id"].ToString();
// set attribute NodeData to userid
sb.Append("<TreeNode NodeData=\"");
sb.Append(id);
// set attribute Text to zhname
sb.Append("\" Text=\"");
sb.Append(dr["zhname"].ToString());
sb.Append("\" ");
// set other attributes
sb.Append(" Checkbox=\"true\" Type=\"user\" Expanded=\"false\" ");
sb.Append(">\r\n");
sb.Append("</TreeNode>");
return sb.ToString();
}
3. TreeCreator.aspx 负责产生整棵树,并为用户提供对树节点的操作界面
1)用于产生树的代码片段
在 aspx 页面头部声明使用 Microsoft.Web.UI.WebControls 控件集合:
<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls" %>
在 aspx 页面中声明使用微软的 TreeView 控件:
<iewc:treeview id="TreeView1" runat="server" ExpandedImageUrl="images/folderopen.gif" SystemImagesPath="/webctrl_client/1_0/treeimages/" ImageUrl="images/folder.gif" EnableViewState="False"></iewc:treeview>
用于初始化树的 JS 代码:
<script language="javascript">
function InitTree()
{
TreeView1.treeNodeSrc = "OrgXMLCreator.aspx?oid=0"; // 根节点,延迟异步加载其下属节点
TreeView1.databind();
}
</script>
用于立即初始化树的 HTML 代码:
<body onload="javascript:InitTree();">
2)控制树节点 CHECKBOX 多选操作的通用 JS 代码
var ids="";
var uids="";
var orgName="";
function tree_oncheck(tree) // 鼠标选中时激发的事件
{
var selectNode = tree.getTreeNode(tree.clickedNodeIndex)
CheckChildren(tree,selectNode.getChildren(),selectNode.getAttribute("checked"));
CheckParent(tree,selectNode.getParent(),selectNode.getAttribute("checked"));
orgName="";
ids="";
uids="";
GetSelectIDs(tree);
}
function GetChildren(Node) // 获取某个节点的下级节点
{
var NodeArray=new Array();
NodeArray=Node.getChildren();
if(NodeArray.length == 0)
{
return;
}
for(var i=0;i<NodeArray.length;i++)
{
var cNode=NodeArray[i];
if(cNode.getAttribute("Checked"))
{
orgName+="["+getFullPath(cNode)+cNode.getAttribute('Text')+"]";
if(cNode.getAttribute("Type")=="ou")
{
if(ids!=""){
ids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
ids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
else if(cNode.getAttribute("Type")=="user")
{
if(uids!=""){
uids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
uids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
}
else
{
GetChildren(cNode);
}
}
}
function GetSelectIDs(tree) // 获取整棵树有哪些节点被选中了
{
var NodeArray=new Array();
NodeArray=tree.getChildren();
for(var i=0;i<NodeArray.length;i++)
{
var cNode=NodeArray[i];
if(cNode.getAttribute("Checked"))
{
orgName+="["+getFullPath(cNode)+cNode.getAttribute('Text')+"]";
if(cNode.getAttribute("Type")=="ou")
{
if(ids!=""){
ids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
ids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
else if(cNode.getAttribute("Type")=="user")
{
if(uids!=""){
uids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
uids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
}
else
{
GetChildren(cNode);
}
}
document.getElementById("hiddenOrgName").innerText=orgName;
document.getElementById("hiddenOrgID").innerText =ids;
document.getElementById("hiddenUsrID").innerText =uids;
}
function CheckChildren(tree,Nodes,TF) // 自动选中下属节点
{
var dft = 0;
if(parseInt(Nodes.length)==0)
{
return;
}
else
{
for(var i=0;i<parseInt(Nodes.length);i++)
{
Nodes[i].setAttribute("Checked",TF);
CheckChildren(tree,Nodes[i].getChildren(),TF);
}
}
}
function CheckParent(tree,Node,TF) // 自动选中父级、爷爷级、太公级的节点
{
if(Node == null)
{
return;
}
else
{
if(TF)
{
}
else
{
Node.setAttribute("Checked",false);
CheckParent(tree,Node.getParent(),false);
}
}
}
function tree_onclick(tree) // 点击节点文字激发的事件
{
//alert(tree.getTreeNode(tree.clickedNodeIndex).getAttribute("Text"));
try
{
var selectNode = tree.getTreeNode(tree.clickedNodeIndex)
//alert(document.getElementById("lblNewOrgName").innerText);
if(selectNode.getAttribute('NodeData')==null)
{
//alert("您不是该组织的管理员!移动到该组织");
}
else
{
document.getElementById("hiddenOrgID").innerText +=selectNode.getAttribute('NodeData')+'|';
var txt = getFullPath(selectNode)+selectNode.getAttribute('Text');
document.getElementById("lblNewOrgName").innerHTML+="["+txt+"]";
}
if (selectNode.getAttribute('Expanded'))
{
selectNode.setAttribute('Expanded','False');
}
else
{
selectNode.setAttribute('Expanded','True');
}
}
catch(e)
{
throw e;
}
}
function getFullPath(node) // 取得节点的完整路径,获得路径中各级节点的文字并用“-”分隔开。
{
var baseNode =node.getParent();
if(baseNode !=null)
{
var txt =baseNode.getAttribute('Text');
//alert(txt);
return getFullPath(baseNode)+txt+"--";
}
return "";
}
代码完毕。
其他需求:组织单位总数约三千个,用户总数约四万人。
环境:.NET Framework 1.1
IDE:Visual Studio.NET 2003
1. OrgXMLCreator.aspx 是一个空白的 Web 窗体
OrgXMLCreator.aspx.cs 目的是生成组织节点,内容片段如下:
private void Page_Load(object sender, System.EventArgs e)
{
string orgID = Request.QueryString["oid"].ToString().Trim();
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
if(orgID.Length >0 )
{
Response.Write (CreateXml(orgID));
}
Response.End();
}
public string CreateXml(string orgID)
{
StringBuilder sb = new StringBuilder();
//sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n");
sb.Append("<TREENODES>\r\n");
if(orgID!="0")
{
// ======== inner node ================
// set attribute NodeData to userid
sb.Append("<TreeNode NodeData=\"");
sb.Append("0");
// set attribute Text to zhname
sb.Append("\" Text=\"");
sb.Append("直属用户");
sb.Append("\" ");
// set other attributes
sb.Append(" Checkbox=\"false\" Type=\"None\" Expanded=\"true\" ");
sb.Append(" TreeNodeSrc=\"UserXMLCreator.aspx?oid="); // 直属用户的立即异步加载
sb.Append(orgID);
sb.Append("\" ");
sb.Append(">\r\n");
sb.Append("</TreeNode>");
// ====================================
}
DataTable dt = new DataTable();
dt = DataProvider.Instance.GetChildOrg(orgID).Tables[0];
sb.Append(CreateList(dt));
sb.Append("</TREENODES>");
return sb.ToString();
}
protected string CreateList(DataTable dt)
{
StringBuilder sb = new StringBuilder();
try
{
DataRow[] drs = dt.Select("1=1", "Showorder");
foreach(DataRow dr in drs)
{
sb.Append(CreateElement(dr));
}
return sb.ToString();
}
catch
{
return "";
}
}
protected string CreateElement(DataRow dr)
{
StringBuilder sb = new StringBuilder();
string id = dr["id"].ToString();
// set attribute NodeData to userid
sb.Append("<TreeNode NodeData=\"");
sb.Append(id);
// set attribute Text to zhname
sb.Append("\" Text=\"");
sb.Append(dr["name"].ToString());
sb.Append("\" ");
// set other attributes
if(dr["hasPermission"].ToString().Equals("1"))
{
sb.Append(" Checkbox=\"true\" Type=\"OU\" Expanded=\"false\" ");
}
else
{
sb.Append(" Checkbox=\"false\" Type=\"OU\" Expanded=\"false\" ");
}
sb.Append(" TreeNodeSrc=\"OrgXMLCreator.aspx?oid="); // 子组织的延迟异步加载
sb.Append(id);
sb.Append("\" ");
sb.Append(">\r\n");
sb.Append("</TreeNode>");
return sb.ToString();
}
2. UserXMLCreator.aspx 是一个空白的 Web 窗体
UserXMLCreator.aspx.cs 目的是生成用户节点,内容片段如下:
private void Page_Load(object sender, System.EventArgs e)
{
string orgID = Request.QueryString["oid"].ToString().Trim();
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
if(orgID.Length >0 )
{
Response.Write (CreateXml(orgID));
}
Response.End();
}
public string CreateXml(string orgID)
{
StringBuilder sb = new StringBuilder();
//sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n");
sb.Append("<TREENODES>\r\n");
DataTable dt = new DataTable();
dt = DataProvider.Instance.GetUsersInOrganization(orgID).Tables[0];
sb.Append(CreateList(dt));
sb.Append("</TREENODES>");
return sb.ToString();
}
protected string CreateList(DataTable dt)
{
StringBuilder sb = new StringBuilder();
try
{
DataRow[] drs = dt.Select();
foreach(DataRow dr in drs)
{
sb.Append(CreateElement(dr));
}
return sb.ToString();
}
catch
{
return "";
}
}
protected string CreateElement(DataRow dr)
{
StringBuilder sb = new StringBuilder();
string id = dr["id"].ToString();
// set attribute NodeData to userid
sb.Append("<TreeNode NodeData=\"");
sb.Append(id);
// set attribute Text to zhname
sb.Append("\" Text=\"");
sb.Append(dr["zhname"].ToString());
sb.Append("\" ");
// set other attributes
sb.Append(" Checkbox=\"true\" Type=\"user\" Expanded=\"false\" ");
sb.Append(">\r\n");
sb.Append("</TreeNode>");
return sb.ToString();
}
3. TreeCreator.aspx 负责产生整棵树,并为用户提供对树节点的操作界面
1)用于产生树的代码片段
在 aspx 页面头部声明使用 Microsoft.Web.UI.WebControls 控件集合:
<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls" %>
在 aspx 页面中声明使用微软的 TreeView 控件:
<iewc:treeview id="TreeView1" runat="server" ExpandedImageUrl="images/folderopen.gif" SystemImagesPath="/webctrl_client/1_0/treeimages/" ImageUrl="images/folder.gif" EnableViewState="False"></iewc:treeview>
用于初始化树的 JS 代码:
<script language="javascript">
function InitTree()
{
TreeView1.treeNodeSrc = "OrgXMLCreator.aspx?oid=0"; // 根节点,延迟异步加载其下属节点
TreeView1.databind();
}
</script>
用于立即初始化树的 HTML 代码:
<body onload="javascript:InitTree();">
2)控制树节点 CHECKBOX 多选操作的通用 JS 代码
var ids="";
var uids="";
var orgName="";
function tree_oncheck(tree) // 鼠标选中时激发的事件
{
var selectNode = tree.getTreeNode(tree.clickedNodeIndex)
CheckChildren(tree,selectNode.getChildren(),selectNode.getAttribute("checked"));
CheckParent(tree,selectNode.getParent(),selectNode.getAttribute("checked"));
orgName="";
ids="";
uids="";
GetSelectIDs(tree);
}
function GetChildren(Node) // 获取某个节点的下级节点
{
var NodeArray=new Array();
NodeArray=Node.getChildren();
if(NodeArray.length == 0)
{
return;
}
for(var i=0;i<NodeArray.length;i++)
{
var cNode=NodeArray[i];
if(cNode.getAttribute("Checked"))
{
orgName+="["+getFullPath(cNode)+cNode.getAttribute('Text')+"]";
if(cNode.getAttribute("Type")=="ou")
{
if(ids!=""){
ids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
ids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
else if(cNode.getAttribute("Type")=="user")
{
if(uids!=""){
uids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
uids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
}
else
{
GetChildren(cNode);
}
}
}
function GetSelectIDs(tree) // 获取整棵树有哪些节点被选中了
{
var NodeArray=new Array();
NodeArray=tree.getChildren();
for(var i=0;i<NodeArray.length;i++)
{
var cNode=NodeArray[i];
if(cNode.getAttribute("Checked"))
{
orgName+="["+getFullPath(cNode)+cNode.getAttribute('Text')+"]";
if(cNode.getAttribute("Type")=="ou")
{
if(ids!=""){
ids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
ids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
else if(cNode.getAttribute("Type")=="user")
{
if(uids!=""){
uids+="," + "\'" + cNode.getAttribute("NodeData") + "\'";
}
else{
uids+="\'" + cNode.getAttribute("NodeData") + "\'";
}
}
}
else
{
GetChildren(cNode);
}
}
document.getElementById("hiddenOrgName").innerText=orgName;
document.getElementById("hiddenOrgID").innerText =ids;
document.getElementById("hiddenUsrID").innerText =uids;
}
function CheckChildren(tree,Nodes,TF) // 自动选中下属节点
{
var dft = 0;
if(parseInt(Nodes.length)==0)
{
return;
}
else
{
for(var i=0;i<parseInt(Nodes.length);i++)
{
Nodes[i].setAttribute("Checked",TF);
CheckChildren(tree,Nodes[i].getChildren(),TF);
}
}
}
function CheckParent(tree,Node,TF) // 自动选中父级、爷爷级、太公级的节点
{
if(Node == null)
{
return;
}
else
{
if(TF)
{
}
else
{
Node.setAttribute("Checked",false);
CheckParent(tree,Node.getParent(),false);
}
}
}
function tree_onclick(tree) // 点击节点文字激发的事件
{
//alert(tree.getTreeNode(tree.clickedNodeIndex).getAttribute("Text"));
try
{
var selectNode = tree.getTreeNode(tree.clickedNodeIndex)
//alert(document.getElementById("lblNewOrgName").innerText);
if(selectNode.getAttribute('NodeData')==null)
{
//alert("您不是该组织的管理员!移动到该组织");
}
else
{
document.getElementById("hiddenOrgID").innerText +=selectNode.getAttribute('NodeData')+'|';
var txt = getFullPath(selectNode)+selectNode.getAttribute('Text');
document.getElementById("lblNewOrgName").innerHTML+="["+txt+"]";
}
if (selectNode.getAttribute('Expanded'))
{
selectNode.setAttribute('Expanded','False');
}
else
{
selectNode.setAttribute('Expanded','True');
}
}
catch(e)
{
throw e;
}
}
function getFullPath(node) // 取得节点的完整路径,获得路径中各级节点的文字并用“-”分隔开。
{
var baseNode =node.getParent();
if(baseNode !=null)
{
var txt =baseNode.getAttribute('Text');
//alert(txt);
return getFullPath(baseNode)+txt+"--";
}
return "";
}
代码完毕。
相关文章推荐
- TreeView 控件树节点 TreeNode 的异步加载及对节点 CHECKBOX 的多选控制
- Asp.net TreeView异步加载数据,并结合checkbox实现多选删除
- 在TreeView 控件上,如果双击任何一个节点的checkbox 只会收到一次After_Check事件 但是check属性变化两次(从false到true 再从true到false),请问该如何解决,谢谢!
- C# treeview控件部分节点添加checkbox
- TreeView控件无限级 一次性加载和异步加载剖析
- ComponentArt.UI 2008-TreeView控件控制CheckBox全选与反选,以及读取Xml权限
- 潜移默化学会WPF(Treeview异步加载节点)
- C#winfrom 中 TreeView 控件中带checkbox,怎么实现在父节点上打勾,选中全部子节点?
- TreeView控件的CheckBox自动实现父子节点递归选定
- TreeView中父子节点的checkbox的同时选中问题,js控制.
- TreeView控件时发现带有CheckBox控件的TreeNode对象(TreeView节点),选择CheckBox无法回发页面
- Winform 点击TreeView控件节点的CheckBox不触发NodeMouseClick事件的做法
- C#TreeView控件控制某些节点的checkbox不显示
- [Silverlight入门系列]Prism中TreeView真正实现MVVM模式和Expanded发生时异步动态加载子节点(WCFRiaService)
- TreeView控件无限级 一次性加载和异步加载剖析
- TreeView控件的一些关于节点的CheckBox使用
- 包含CheckBox的TreeView控件——父节点选中时其子节点不可选,子节点有项选中时其父节点不可选
- treeview控件的Expand事件下加载数据的控制
- JS控制TreeView的CheckBox控件的全选与全不选脚本
- 微软treeview控件异步加载实现方式