1.         定义属性

publicProperty将在设计时控件的属性窗口中显示,添加各种类型的Attribute可以影响属性的展现形式和持久化形式。

         BrowsableAttribute:指定一个属性或事件是否应显示在属性窗口中;

        CategoryAttribute应用到属性或事件,指定属性或事件在属性浏览器中列出时所处的类别;

         DescriptionAttribute应用于属性或事件,指定在属性浏览器中显示的对属性或事件的说明。

         DesignOnlyAttribute应用于属性,指定是否只能在设计时设置属性。

         ReadOnlyAttribute应用于属性,指定在设计时属性是只读还是可读/写。

         BindableAttribute确定属性是否适合数据绑定器进行绑定

         PersistenceModeAttribute:定义指定如何将 ASP.NET 服务器控件属性或事件保持到 ASP.NET 页的元数据属性。InnerProperty:指定属性作为服务器控件的开始和结束标记内部的嵌套标记保持。如下面例中的HeaderStyle

         DesignerSerializationVisibilityAttribute:指定在设计时序列化组件上的属性时所使用的持久性类型。Content:代码生成器产生对象内容的代码,而不是对象本身的代码。Hidden:代码生成器不生成对象的代码。Visible:代码生成器生成对象的代码。如下面例中的TableStyle

<cc1:exrepeater id="ExRepeater1" runat="server" TableStyle-BorderStyle="Dotted">
       <HeaderStyle BackColor="#C0C0FF"></HeaderStyle>
</cc1:exrepeater>

         NotifyParentPropertyAttribute:指示当此属性应用到的属性的值被修改时将通知父属性。如果属性的父属性应该在该属性值更改时接到通知,则向该属性应用 NotifyParentPropertyAttribute

         MergablePropertyAttribute:在属性浏览器中当多个组件被浏览和选中时,允许或阻止包含某属性。

         DesignTimeVisibleAttribute:是否在设计器上显示该组件。

         ToolboxItemAttribute:是否在工具箱中显示该组件,或指定显示的工具箱名称/类型。

 

2.         呈现服务器控件

         重写 Render 以将 HTML(或其他标记内容)作为字符串参数传递到 HtmlTextWriter 的实例的 Write 方法。Control 基类提供 RenderChildren 方法以从其子控件(如果有)呈现内容。

         System.Web.UI.WebControls.WebControl 类还提供其他几个方法来便于呈现:AddAttributesToRender 方法添加需要呈现的 HTML 属性和样式;
RenderBeginTag
RenderEndTag 方法重写开始和结束 HTML 元素标记;
RenderContents
方法指定标记内的内容。

         ISite.DesignMode 属性:确定组件在由类实现时是否处于设计模式。实际使用时用
if ( (this.Page != null) && (this.Page.Site != null) && this.Page.Site.DesignMode )
判断

 

3.         定义事件

  定义保存事件数据的类,继承System.EventArgs(在控件之外定义);

  定义事件委托,继承System.EventHandler(在控件之外定义);

  在控件中定义的事件成员。该成员由 event 关键字标识

  调用委托的控件中的方法(例如:OnClickOnTextChanged)。

 

4.         生成和捕获回发事件

  控件实现IPostBackEventHandler接口,允许控件在服务器上引发事件来响应来自客户端的回发。

  生成:用方法PageGetPostBackClientHyperlink生成服务器回发事件的超链接。参数为处理回发的服务器控件和传递给服务器控件的参数。
  捕获:在控件的IPostBackEventHandler.RaisePostBackEvent方法中处理回发事件。

 

5.         开发复合控件

         INamingContainer:标记接口,为每个子服务器控件创建新 ID 命名空间 

      使用 CreateChildControls创建子控件

         事件冒泡的技术,允许子控件将事件沿其包容层次结构向上传播。RaiseBubbleEvent 沿层次结构向上将事件数据发送到控件的父级。若要处理或引发冒泡的事件,控件必须重写 OnBubbleEvent方法。

 

6.         类型转换

  TypeConverterAttribute指定用作此特性所绑定到的对象的转换器的类型。带有该属性的类可以保存在ViewState中。给属性添加Attribute[TypeConverter(typeof(CustomerConverter))]。用于转换的类必须从 TypeConverter 继承。简单定义可重写以下方法:CanConvertFromCanConvertToConvertFrom ConvertTo

 

7.         属性的编辑器

  要自动运用集合编辑器。属性的类型必须实现Llist接口,并定义好AddDelete方法,方法的参数须声明为正确的类型。

自定义设计时 UI 类型编辑器:

         使用EditorAttribute指定用来更改属性的编辑器。给属性添加Attribute[EditorAttribute(typeof(CustomerEditor), typeof(System.Drawing.Design.UITypeEditor))]

         定义一个从 System.Drawing.Design.UITypeEditor 派生的类。

         重写 EditValue 方法以处理用户界面、用户输入操作以及值的分配。用provider.GetService(typeof(IWindowsFormsEditorService))得到显示 Windows 窗体,或者在设计模式下在属性网格控件的下拉区域中显示控件的IWindowsFormsEditorServiceCloseDropDown关闭所有以前打开的下拉控件区域。DropDownControl在提供此服务的属性网格的值字段下方的下拉区域中显示指定控件。ShowDialog显示指定的Form

         重写 GetEditStyle 方法,将编辑器将使用的编辑器样式的类型通知给“属性”窗口。返回值为UITypeEditorEditStyle
DropDown
:显示向下箭头按钮,而且该用户界面将在一个下拉对话框中承载。
Modal
:显示省略号 (...) 按钮,该按钮用于启动模式对话框或有窗口的对话框。
None
:不提供任何交互用户界面 (UI) 组件。

 

SDK: ms-help://MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconservercontrolssamples.htm