部门选择控件源代码公布
為了答謝大家對(duì)無(wú)須迭代兩個(gè)循環(huán)完成樹(shù)結(jié)構(gòu)構(gòu)建的支持特公布這兩天新寫(xiě)的部門選擇控件源代碼,該控件最早是用一個(gè)用戶控件實(shí)現(xiàn)數(shù)據(jù)調(diào)用采用Linq界面采用AtlasControlToolkit PopupControl實(shí)現(xiàn),但后來(lái)發(fā)現(xiàn)效率非常低,最近對(duì)其進(jìn)行了很大的優(yōu)化,數(shù)據(jù)調(diào)用優(yōu)化,控件形式優(yōu)化.
該控件采用了Nikhil Kothari的Atlas M2.2 - Dynamic UpdatePanels (finally)的UpdatePanels within Composite Controls原型 here.并對(duì)其進(jìn)行了部分改動(dòng),在這里謝謝了.
web頁(yè)面截圖如下:
?
IPartialRenderingCompositeControl接口沒(méi)動(dòng)
| public interface IPartialRenderingCompositeControl |
| { |
| ????void RenderUpdatePanel(CompositionUpdatePanel updatePanel, HtmlTextWriter writer); |
| } |
CompositionUpdatePanel修改了內(nèi)嵌類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); |
| ????????} |
| ???? } |
| ????} |
| } |
樹(shù)圖代碼:
| [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; |
| ????} |
| } |
?數(shù)據(jù)庫(kù)訪問(wèn)代碼:
| [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); |
| ????} |
| } |
存儲(chǔ)過(guò)程代碼:
| 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
轉(zhuǎn)載于:https://www.cnblogs.com/Bolik/archive/2006/09/11/501141.html
總結(jié)
以上是生活随笔為你收集整理的部门选择控件源代码公布的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谷歌 Gboard 输入法 12.9.2
- 下一篇: 现在的小孩真是早熟