自定义控件需要定义一个直接或间接从 Control 类派生的类,并重写 Render 方法。在 .NET 框架中, System.Web.UI.Control 与System.Web.UI.WebControls.WebControl 两个类是服务器控件的基类,并且定义了所有服务器控件共有的属性、方法和事件,其中最为重要的就是包括了控制控件执行生命周期的方法和事件,以及ID等共有属性。 实现自定义控件,必须创建一个自定义控件,自定义控件将会编译成 DLL文件。
首先看一下运行效果:
创建自定义服务器控件代码
创建Discuz.Contrcol类库文件,在其中创建Button.cs 文件
引用System.Web.UI.WebControls和System.ComponentModel命名空间
Button.cs文件部分代码如下:
namespace Discuz.Controls
{
[DefaultEvent("Click"), DefaultProperty("Text"), ToolboxData("<{0}:Button runat=server></{0}:Button>")]
public class Button : System.Web.UI.WebControls.WebControl,IPostBackEventHandler
{
/*代码省略*/
#region properytyButtontypeMode 按钮样式
public enum ButtonType
{
Normal, //普通
WithImage, //带图
XpStyle //不带图
}
public ButtonType ButtontypeMode
{
get
{
object obj = ViewState["ButtontypeMode"];
return obj == null ? ButtonType.WithImage : (ButtonType)obj;
}
set
{
ViewState["ButtontypeMode"] = value;
}
}
#endregion
/*代码省略*/
}
}
代码讨论:
如果控件要呈现用户界面 (UI) 元素或任何其他客户端可见的元素,则应从 System.Web.UI.WebControls.WebControl(或派生类)派生该控件。如果控件要呈现在客户端浏览器中不可见的元素(如隐藏元素或meta 元素),则应从System.Web.UI.Control 派生该控件。
DefaultEventAttribute
设计时属性。
在可视化设计器中指定控件的默认事件。在许多可视化设计器中,页开发人员在设计图面上双击控件时,将打开代码编辑器,同时将光标定位到默认事件的事件处理程序中。
示例:DefaultEvent("Click")
DefaultPropertyAttribute
设计时属性。
当页开发人员在设计图面上选择控件时,此属性 (Attribute) 中指定的属性 (Property) 将在可视化设计器的属性 (Property) 浏览器中突出显示此默认属性。
示例:[DefaultProperty("Text")]
ToolboxDataAttribute
设计时属性。
指定从工具箱创建控件时可视化设计器为标记创建的标记格式。
示例:ToolboxData("<{0}:Button runat=server></{0}:Button>")
更多关于自定义服务器控件的元数据属性的介绍请参考:http://msdn.microsoft.com/zh-cn/library/ms178658(v=vs.90).aspx
ViewState
获取状态信息的字典,这些信息使您可以在同一页的多个请求间保存和还原服务器控件的视图状态。命名空间:System.Web.UI
示例:
public String Text
{
get
{
object o = ViewState["text"];
return (o == null)? String.Empty : (string)o;
}
set
{
ViewState["Text"] = value;
}
}
按钮上显示的文字
#region Property Text 按钮文字
/// <summary>
/// 按钮文字
/// </summary>
[Bindable(true), Category("Appearance"), DefaultValue(" 提 交 ")]
public string Text
{
get
{
object obj = ViewState["ButtonText"];
return obj == null ? " 提 交 " : (string)obj;
}
set
{
ViewState["ButtonText"] = value;
}
}
#endregion
代码讨论:
BindableAttribute
设计时属性。
指定将数据绑定到属性是否有意义。在可视化设计器中,属性浏览器可以在对话框中显示控件的可绑定属性。(例如,在 Visual Studio 中,可绑定属性显示在“数据绑定”对话框中。) 如果属性 (Property) 没有使用此属性 (Attribute) 标记,则属性 (Property) 浏览器会推断其值为 Bindable(false)。
示例:[Bindable(true)]
CategoryAttribute
设计时属性。
指定如何在可视化设计器的属性浏览器中对属性进行分类。例如,当页开发人员在属性浏览器中使用分类视图时,Category("Appearance") 将告知属性浏览器在“外观”类别中显示属性。可以指定一个对应于属性浏览器中的现有类别的字符串参数,也可以创建自己的类别。
示例:[Category("Appearance")]
DefaultValueAttribute
设计时属性。
指定属性的默认值。此值应与从属性访问器 (getter) 返回的默认值相同。在有些可视化设计器(如 Visual Studio)中,DefaultValueAttribute 属性允许页开发人员使用快捷菜单上的“重置”命令将属性值重置为其默认值。
示例:DefaultValue(" 提 交 ")
图片按钮链接
#region Property ButtonImgUrl 图版按钮链接
/// <summary>
/// 图片按钮链接
/// </summary>
[Description("图版按钮链接"), DefaultValue("../images/submit.gif")]
public string ButtonImgUrl
{
get
{
object obj = ViewState["ButtonImgUrl"];
return obj == null ? "../images/submit.gif" : (string)obj;
}
set
{
ViewState["ButtonImgUrl"] = value;
}
}
#endregion
代码讨论:
DescriptionAttribute
设计时属性。
指定属性的简短描述。在可视化设计器(如 Visual Studio)中,属性浏览器通常在窗口底部显示选定的属性的描述。
示例:Description("图版按钮链接")
DefaultValueAttribute
设计时属性。
指定属性的默认值。此值应与从属性访问器 (getter) 返回的默认值相同。在有些可视化设计器(如 Visual Studio)中,DefaultValueAttribute 属性允许页开发人员使用快捷菜单上的“重置”命令将属性值重置为其默认值。
示例:DefaultValue("../images/submit.gif")
背景图片路径
#region Property XpBGImgFilePath XP背景图片路径
/// <summary>
/// XP背景图片路径
/// </summary>
[Description("图版按钮链接"), DefaultValue("../images/")]
public string XpBGImgFilePath
{
get
{
object obj = ViewState["XpBGImgFilePath"];
return obj == null ? "../images/" : (string)obj;
}
set
{
ViewState["XpBGImgFilePath"] = value;
}
}
#endregion
代码讨论:
由于关于此属性的知识点已在前面属性中进行了讲解,这里就不再赘述,下面此情况同理
要加载的客户端脚本内容
#region Property ScriptContent 要加载的客户端脚本内容
/// <summary>
/// 要加载的客户端脚本内容
/// </summary>
[Description("图版按钮链接"), DefaultValue("../images/")]
public string ScriptContent
{
get
{
object obj = ViewState["ScriptContent"];
return obj == null ? "" : (string)obj;
}
set
{
ViewState["ScriptContent"] = value;
}
}
#endregion