#眉標=ASP.NET #副標=Inside ASP.NET 2.0 #大標=Controls Model的基礎類別 #作者=文/黃忠成 -----box 程式----- 程式1 建立含有Smart Task的控件 #region Using directives using System; using System.Collections.Generic; using System.Text; using System.Web.UI.WebControls; using System.ComponentModel; using System.ComponentModel.Design; using System.Web.UI.Design; using System.Web.UI.Design.WebControls; #endregion namespace ClassLibrary1{ public class SCCDesignerActionList : DesignerActionList { private ControlDesigner _designer; public bool ShowText { get { return ((SimpleDesignerTest)_designer.Component).ShowText; } Set { ((SimpleDesignerTest)_designer.Component).ShowText = value; _designer.UpdateDesignTimeHtml(); } } public SCCDesignerActionList(ControlDesigner designer):base() { _designer = designer; } public void FireShowText() { ShowText = true; } public void FireHideText() { ShowText = false; } public override DesignerActionItem[] GetSortedActionItems() { DesignerActionPropertyItem item = new DesignerActionPropertyItem("ShowText", "Show Text","Appearence"); DesignerActionMethodItem m_item; if (!ShowText) m_item = new DesignerActionMethodItem(this,              "FireShowText", "Show Text","Actions"); else m_item = new DesignerActionMethodItem(this, "FireHideText", "Hide Text", "Actions"); return new DesignerActionItem[] {item,m_item}; } } public class SCCControlDesigner : System.Web.UI.Design.ControlDesigner { public SCCControlDesigner() : base() { } public override DesignerActionListCollection ActionLists { get { DesignerActionListCollection actions = new DesignerActionListCollection(); actions.AddRange(base.ActionLists); actions.Add(new SCCDesignerActionList(this)); return actions; } } } [DesignerAttribute(typeof(SCCControlDesigner), typeof(IDesigner))] public class SimpleDesignerTest:WebControl { public bool ShowText { get { object o = ViewState["ShowText"]; if (o != null) return (bool)o; return true; } set { ViewState["ShowText"] = value; } } protected override void Render(System.Web.UI.HtmlTextWriter writer) { if(ShowText) writer.WriteLine("TEST"); } public SimpleDesignerTest() { } } } -----end----- -----box 程式----- 程式2 SimleTable 控件 #region Using directives using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.ComponentModel; using System.Web.UI.Design.WebControls; #endregion namespace ClassLibrary1 { public class SimpleTableDesigner : DataBoundControlDesigner { } [Designer(typeof(SimpleTableDesigner))] public class SimpleTable:DataBoundControl { private IEnumerable _dataRecs; protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Table; } } protected virtual void RenderHeader() { if (_dataRecs != null) { foreach (object item in _dataRecs) { HtmlTableRow row = new HtmlTableRow(); foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(item)) { HtmlTableCell col = new HtmlTableCell(); col.Controls.Add(new LiteralControl(prop.Name)); row.Controls.Add(col); } Controls.Add(row); break; } } } protected virtual void RenderRows() { if (_dataRecs != null) { foreach (object item in _dataRecs) { HtmlTableRow row = new HtmlTableRow(); foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(item)) { HtmlTableCell col = new HtmlTableCell(); object v = prop.GetValue(item); if (v != null) col.Controls.Add(new LiteralControl(v.ToString())); row.Controls.Add(col); } Controls.Add(row); } } } private void OnSelectCallBack(IEnumerable data) { _dataRecs = data; } protected void RetrieveData() { DataSourceView view = GetData(); if(view != null) view.Select(DataSourceSelectArguments.Empty,            new DataSourceViewSelectCallback(OnSelectCallBack)); } public override void DataBind() { ClearChildControlState(); Controls.Clear(); RetrieveData(); RenderHeader(); RenderRows(); ChildControlsCreated = true; TrackViewState(); } protected override void OnPreRender(EventArgs e) { if (_dataRecs == null) DataBind(); base.OnPreRender(e); } public SimpleTable() { } } }-----end----- -----box 程式----- [NonVisualControl(true)]-----end----- -----box 程式----- 程式3 #region Using directives using System; using System.Collections.Generic; using System.Text; using System.Security.Permissions; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.ComponentModel; #endregion namespace ClassLibrary1{ public class MySimpleWebPart:WebPart { public override bool AllowEdit { get { return true; } set { base.AllowEdit = value; } } public string Text { get { object o = ViewState["Text"]; if (o != null) return (string)o; return String.Empty; } set { ViewState["Text"] = value; } } [WebBrowsable,Personalizable(PersonalizationScope.User)] public string TestVeriable { get { return "TEST"; } set { ;} } [WebBrowsable,Personalizable,Category("Behavior")] public string TestVeriable2 { get { return "TEST"; } set { ;} } [ConnectionProvider("provider","provider")] public object GetData() { return Text; } [ConnectionConsumer("consumer","consumer")] public void SetData(object data) { Text = (string)data; } protected override void RenderContents(HtmlTextWriter writer) { writer.WriteLine(Text); } public MySimpleWebPart() { } } }-----end----- -----box 程式----- 程式10 LowcaseTextBox #region Using directives using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Web.UI; using System.Web.UI.WebControls; #endregion namespace ClassLibrary1{ public class LowcaseTextBox:TextBox,ICallbackEventHandler { private const string SCRIPT = ""; public LowcaseTextBox() { } protected override void AddAttributesToRender( HtmlTextWriter writer) { base.AddAttributesToRender(writer); writer.AddAttribute(        HtmlTextWriterAttribute.Onchange, Page.GetCallbackEventReference(           this,ClientID+".value","SetText",null)); } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); Page.ClientScript.RegisterClientScriptBlock(           GetType(), ClientID, SCRIPT.Replace("%ID%",ClientID)); } #region ICallbackEventHandler Members public string RaiseCallbackEvent(string eventArgument) { return eventArgument.ToLower(); } #endregion } }-----end-----