部门选择控件源代码公布
为了答谢大家对无须迭代两个循环完成树结构构建的支持特公布这两天新写的部门选择控件源代码,该控件最早是用一个用户控件实现数据调用采用Linq界面采用AtlasControlToolkit PopupControl实现,但后来发现效率非常低,最近对其进行了很大的优化,数据调用优化,控件形式优化.
该控件采用了Nikhil Kothari的Atlas M2.2 - Dynamic UpdatePanels (finally)的UpdatePanels within Composite Controls原型 here.并对其进行了部分改动,在这里谢谢了.
web页面截图如下:
IPartialRenderingCompositeControl接口没动
public interface IPartialRenderingCompositeControl |
{ |
void RenderUpdatePanel(CompositionUpdatePanel updatePanel, HtmlTextWriter writer); |
} |
CompositionUpdatePanel修改了内嵌类Template的代码
public class CompositionUpdatePanel : UpdatePanel |
{ |
private IPartialRenderingCompositeControl _compositeControl; |
private ContentControl _content; |
public CompositionUpdatePanel(IPartialRenderingCompositeControl compositeControl) |
{ |
_compositeControl = compositeControl; |
_content = new ContentControl(); |
ContentTemplate = new Template(_content); |
} |
public Control Content |
{ |
get |
{ |
return _content; |
} |
} |
protected override void OnInit(EventArgs e) |
{ |
base.OnInit(e); |
Controls.Clear(); |
Controls.Add(_content); |
} |
private class Template : ITemplate |
{ |
private ContentControl _ContentControl; |
public Template(ContentControl content) |
{ |
_ContentControl = content; |
} |
public void InstantiateIn(Control container) |
{ |
container.Controls.Add(_ContentControl); |
} |
} |
private class ContentControl : Control |
{ |
protected override void Render(HtmlTextWriter writer) |
{ |
CompositionUpdatePanel updatePanel = (CompositionUpdatePanel)Parent; |
if (updatePanel._compositeControl != null) |
{ |
updatePanel._compositeControl.RenderUpdatePanel(updatePanel, writer); |
} |
else |
{ |
base.RenderChildren(writer); |
} |
} |
} |
} |
树图代码:
[ToolboxData("<{0}:DepartmentTreeView runat=server></{0}:DepartmentTreeView>")] |
public class DepartmentTreeView : CompositeControl, IPartialRenderingCompositeControl |
{ |
private CompositionUpdatePanel _Container; |
private TreeView _DepartmentTreeView; |
public event EventHandler DepartmentIDChanged; |
public Nullable<Guid> DepartmentID |
{ |
get |
{ |
return (Nullable<Guid>)this.ViewState["DepartmentID"]; |
} |
set |
{ |
if ((Nullable<Guid>)this.ViewState["DepartmentID"] != value) |
{ |
this.ViewState["DepartmentID"] = value; |
if (value.HasValue) |
{ |
AIO.Web.Utils.TreeViewUtils.TreeViewSelectValue(_DepartmentTreeView, value.Value.ToString()); |
this.ViewState["DepartmentName"] = _DepartmentTreeView.SelectedNode.Text; |
} |
else |
{ |
if (_DepartmentTreeView.SelectedNode != null) |
{ |
_DepartmentTreeView.SelectedNode.Selected = false; |
this.ViewState["DepartmentName"] = String.Empty; |
} |
} |
} |
} |
} |
public string DepartmentName |
{ |
get |
{ |
return (string)this.ViewState["DepartmentName"]; |
} |
} |
public void ClearSelected() |
{ |
if(_DepartmentTreeView.SelectedNode != null) |
{ |
_DepartmentTreeView.SelectedNode.Selected = false; |
} |
} |
protected void BuildTree() |
{ |
_DepartmentTreeView.Nodes.Clear(); |
_DepartmentTreeView.Nodes.Add(new TreeNode("Null")); |
DataSet ds = AIO.WIT.Data.DepartmentDataObject.ReadCore(); |
int |
TreeNode[] Nodes = new TreeNode[Count + 1]; |
Nullable<int>[] ParentSQNs = new Nullable<int>[Count + 1]; |
foreach (DataRow dr in ds.Tables[0].Rows) |
{ |
Nodes[((int)dr["DepartmentSQN"])] = new TreeNode((string)dr["DepartmentName"], ((Guid)dr["DepartmentID"]).ToString()); |
if (dr["ParentSQN"].GetType() == typeof(DBNull)) |
{ |
ParentSQNs[(int)dr["DepartmentSQN"]] = null; |
} |
else |
{ |
ParentSQNs[(int)dr["DepartmentSQN"]] = (int)dr["ParentSQN"]; |
} |
} |
for (int i = 1; i < Count + 1; i++) |
{ |
if (ParentSQNs[i].HasValue) |
{ |
Nodes[ParentSQNs[i].Value].ChildNodes.Add(Nodes[i]); |
} |
else |
{ |
_DepartmentTreeView.Nodes.Add(Nodes[i]); |
} |
} |
} |
protected override void OnInit(EventArgs e) |
{ |
base.OnInit(e); |
} |
protected override void CreateChildControls() |
{ |
_Container = new CompositionUpdatePanel(this); |
_Container.Mode = UpdatePanelMode.Conditional; |
_Container.RenderMode = UpdatePanelRenderMode.Inline; |
_Container.ID = "Container"; |
Controls.Add(_Container); |
_DepartmentTreeView = new TreeView(); |
_DepartmentTreeView.ID = "DepartmentTreeView"; |
BuildTree(); |
_DepartmentTreeView.SelectedNodeChanged += delegate(object sender, EventArgs e) |
{ |
if (_DepartmentTreeView.SelectedNode.Text == "Null") |
{ |
this.ViewState["DepartmentID"] = null; |
this.ViewState["DepartmentName"] = String.Empty; |
} |
else |
{ |
this.ViewState["DepartmentID"] = new Guid(_DepartmentTreeView.SelectedNode.Value); |
this.ViewState["DepartmentName"] = _DepartmentTreeView.SelectedNode.Text; |
} |
if (DepartmentIDChanged != null) |
{ |
DepartmentIDChanged(this, new EventArgs()); |
} |
}; |
_Container.Content.Controls.Add(_DepartmentTreeView); |
} |
void IPartialRenderingCompositeControl.RenderUpdatePanel(CompositionUpdatePanel updatePanel, HtmlTextWriter writer) |
{ |
_DepartmentTreeView.RenderControl(writer); |
} |
} |
部门选择代码:
[ToolboxData("<{0}:DepartmentSelect runat=server></{0}:DepartmentSelect>")] |
public class DepartmentSelect : CompositeControl, IPartialRenderingCompositeControl |
{ |
private CompositionUpdatePanel _Container; |
private TextBox _DepartmentTextBox; |
private Panel _DepartmentTreeViewPanel; |
private DepartmentTreeView _DepartmentTreeView; |
private PopupControlExtender _PopupControlExtender; |
private PopupControlProperties _PopupControlProperties; |
public Nullable<Guid> DepartmentID |
{ |
get |
{ |
return _DepartmentTreeView.DepartmentID; |
} |
set |
{ |
_DepartmentTreeView.DepartmentID = value; |
} |
} |
protected override void OnInit(EventArgs e) |
{ |
base.OnInit(e); |
} |
protected override void CreateChildControls() |
{ |
_Container = new CompositionUpdatePanel(this); |
_Container.Mode = UpdatePanelMode.Conditional; |
_Container.RenderMode = UpdatePanelRenderMode.Inline; |
_Container.ID = "Container"; |
Controls.Add(_Container); |
_DepartmentTextBox = new TextBox(); |
_DepartmentTextBox.ID = "DepartmentTextBox"; |
_Container.Content.Controls.Add(_DepartmentTextBox); |
_DepartmentTreeViewPanel = new Panel(); |
_DepartmentTreeViewPanel.ID = "DepartmentTreeViewPanel"; |
_DepartmentTreeViewPanel.CssClass = "PopupControl"; |
_DepartmentTreeView = new DepartmentTreeView(); |
_DepartmentTreeView.ID = "DepartmentTreeView"; |
_DepartmentTreeView.DepartmentIDChanged += delegate(object sender, EventArgs e) |
{ |
_DepartmentTextBox.Text = _DepartmentTreeView.DepartmentName; |
_DepartmentTreeView.ClearSelected(); |
_PopupControlExtender.Commit(_DepartmentTreeView.DepartmentName); |
}; |
_DepartmentTreeViewPanel.Controls.Add(_DepartmentTreeView); |
_Container.Content.Controls.Add(_DepartmentTreeViewPanel); |
_PopupControlProperties = new PopupControlProperties(); |
_PopupControlProperties.ID = "PopupControlProperties"; |
_PopupControlProperties.TargetControlID = "DepartmentTextBox"; |
_PopupControlProperties.PopupControlID = "DepartmentTreeViewPanel"; |
_PopupControlProperties.Position = PopupControlPopupPosition.Bottom; |
_PopupControlExtender = new PopupControlExtender(); |
_PopupControlExtender.ID = "PopupControlExtender"; |
_PopupControlExtender.TargetProperties.Add(_PopupControlProperties); |
Controls.Add(_PopupControlExtender); |
} |
void IPartialRenderingCompositeControl.RenderUpdatePanel(CompositionUpdatePanel updatePanel, HtmlTextWriter writer) |
{ |
_DepartmentTextBox.RenderControl(writer); |
_DepartmentTreeViewPanel.RenderControl(writer); |
_PopupControlExtender.RenderControl(writer); |
} |
} |
TreeViewUtils代码:
public class TreeViewUtils |
{ |
public static void TreeViewExpandToSelected(TreeView tv) |
{ |
TreeNode tmp = tv.SelectedNode; |
if (tmp != null) |
{ |
while (tmp.Parent != null) |
{ |
tmp = tmp.Parent; |
tmp.Expand(); |
} |
} |
} |
public static Boolean TreeViewSelectValue(TreeView tv, string value) |
{ |
Boolean bResult = false; |
foreach (TreeNode tr in tv.Nodes) |
{ |
if (TreeViewSelectValue(tr, value)) |
{ |
bResult = true; |
break; |
} |
} |
if (bResult) |
{ |
TreeViewExpandToSelected(tv); |
} |
else |
{ |
if (tv.SelectedNode != null) |
{ |
tv.SelectedNode.Selected = false; |
} |
} |
return bResult; |
} |
protected static Boolean TreeViewSelectValue(TreeNode tr, string value) |
{ |
if (tr.Value == value) |
{ |
tr.Selected = true; |
return true; |
} |
foreach (TreeNode test in tr.ChildNodes) |
{ |
if (TreeViewSelectValue(test, value)) |
{ |
return true; |
} |
} |
return false; |
} |
} |
数据库访问代码:
[DataObject(true)] |
public class DepartmentDataObject |
{ |
[DataObjectMethod(DataObjectMethodType.Select, true)] |
public static DataSet ReadCore() |
{ |
Database db = DatabaseFactory.CreateDatabase("WorkItemTrack"); |
string sqlCommand = "Department_SelectCore"; |
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand); |
db.AddReturnValueParameter(dbCommand); |
return db.ExecuteDataSet(dbCommand); |
} |
} |
存储过程代码:
ALTER PROCEDURE dbo.Department_SelectCore |
AS |
SET NOCOUNT ON |
SELECT |
Department.DepartmentID, |
Department.DepartmentSQN, |
Department.DepartmentName, |
Department.ParentID, |
Parent.DepartmentSQN AS ParentSQN |
FROM Department |
LEFT OUTER JOIN Department AS Parent ON Parent.DepartmentID = Department.ParentID |
ORDER BY Department.DepartmentSQN |
RETURN |
表格:
DepartmentID uniqueidentifier, |
DepartmentSQN int, |
DepartmentName nvarchar(32), |
ParentID uniqueidentifier |
完整代码下载DepartmentSelect.rar
转载于:https://www.cnblogs.com/Bolik/archive/2006/09/11/501141.html
部门选择控件源代码公布相关推荐
- 【仿汽车之家】价格区间选择控件
仿照汽车之家iOS客户端"找车"栏目的价格区间选择控件,最终实现效果如下: 一.界面实现 *根据屏幕大小以及刻度的大小,宏定义需要用到的一些值 #define SCREENW [U ...
- javascript 打造城市选择控件,兼容IE6以及以上,谷歌,Firefox
在淘宝旅行上看到的城市选择效果,感觉还不错,就自己的理解重新实现一遍,先看效果,然后再细说实现原理,支持鼠标上下键选择城市,支持直接输入城市名称,拼音首字母,全拼,支持IE6遮盖SELECT,压缩后1 ...
- 四种常见的浏览器内核简介----JS城市选择控件
一 四种常见的浏览器内核简介 Gecko: Gecko: Netscape6开始采用的内核,后来的Mozilla FireFox (火狐浏览器) 也采用了该内核,Gecko的特点是代码完全公开,因此, ...
- 城市选择控件文本框【纯javascript打造】兼容IE6以及以上、谷歌、Firefox
在淘宝旅行上看到的城市选择效果,感觉还不错,就自己的理解重新实现一遍,先看效果,然后再细说实现原理,支持鼠标上下键选择城市,支持直接输入城市名称,拼音首字母,全拼,支持IE6遮盖SELECT,压缩后1 ...
- ExtJS6.0扩展日期选择控件为也可以选择时间
PS:ExtJS自带的日期选择控件只能够选择日期,但是现在的需求需要精确到秒,所以在网上搜索了一些例子(大部分是4.0的)作为参考,然后改出了6.0可用的一个日期时间选择控件. 1.找到extjs6. ...
- 基于JEECG制作一个通用的级联字典选择控件-DictCascadeUniversal
字典是所有MIS系统不可缺少的重要组成部分.为减少输入,标准化输入内容,使得数据更加准确地被输入.往往需要在数据库中配置各种各样的字典表.如下图: 而绝大部分字典的字段简单,且高度一致.建议一个通用的 ...
- 使用sui实现的选择控件【性别、日期、省市级联】
使用sui mobile做的选择控件,其中sm.js有修改,增加自定义api,详情请看index.html的注释,不多说了,上代码 <!DOCTYPE html> <html> ...
- android double比较大小吗,Android双向选择控件DoubleSeekBar使用详解
本文实例为大家分享了Android双向选择控件DoubleSeekBar的使用方法,供大家参考,具体内容如下 先看效果图 1.DoubleSlideSeekBar public class Doubl ...
- altas(ajax)控件(二十三):等级选择控件Rating
一. 简介 等级选择控件Rating提供了一种全新的方式来进行等级选择,在以往的web上我们只能通过使用特殊字符"☆"来表达等级,有了等级选择控件Rating我 ...
最新文章
- 娱乐社交,玩票大的!2021网易云信“融合通信开发者大赛”决赛名单公布!
- python的socks5全局代理_Python写的Socks5协议代理服务器
- 【ACM-ICPC 2018 沈阳赛区网络预赛 I】Lattice's basics in digital electronics
- 电芯容量在前期循环中容量增加_安普瑞斯王岑博士:安普瑞斯的硅负极材料在高能量密度电池中的应用进展...
- 有人公开了Avast、McAfee 等杀软中的 8 个 0day
- android button 图片不缩放,ImageButton如何让图片按比例缩放不被拉伸
- 云计算乱局:你真的懂,什么叫做云吗?(一)
- 重建二叉树(C++)
- treeset java api_JAVAAPI学习值TreeSet类
- 【单片机】keil 2032
- 图标文字垂直居中对齐方法
- 海伦公式——初中数学证明
- 计算机中if函数的使用方法,excelif函数多层嵌套的使用方法
- 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——4 - Tony Trivisonno‘s American Dream(托尼·特里韦索诺的美国梦)
- R包minfi处理DNA甲基化芯片数据
- HTML编辑器UEditor的简单使用
- iOS 9适配技巧(更新版)
- Java Initialization Order
- ACM2023SWJTU寒假选拔赛2不完全题解
- 星秒入选毕马威(KPMG)汽车科技新锐企业榜
热门文章
- tensorflow中的log中数字的含义
- 使用nltk.pos出现IndexError: string index out of range
- sqlite3在ubuntu的终端下面的操作
- P142-144使用Tensorflow自定义一个线性分类器用于对“良/恶性乳腺癌肿瘤”进行预测
- 基于基站定位数据的商圈分析代码详细解释
- leetcode :数组和链表
- 机器学习(二十一)——Optimizer, 单分类SVM多分类SVM, 时间序列分析
- JEPaas代码_((列表)输入字段值而改变值
- 消灭星星网页版java代码,javascript实现消灭星星小游戏简单版
- WCF分布式安全开发实践(9):消息安全模式之Windows身份验证:Message_Windows_NetTcpBinding...