web控件开发系列(四) 自定义控件属性(上)

 控件在WEB开发时经常要用到,虽然有部分已经存在工具箱里,但有时总需要根据自己的要求,开发一些合适自己的控件。
 

1、   系统属性: 当开发控件你选择了继承基类,例如你继承了WebContorlControl,你自定义的控件就会有WebControlControl类的系统属性。(这节还是用上节的例子代码,只是添加了属性设置的代码)

2、   自定义的属性:  例如下面就是自定义属性设置的代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace ServerControl
{
    [DefaultProperty (
"TextBoxValue")]
    [ToolboxData (
"<{0}:RenderOutPut runat=server></{0}:RenderOutPut>")]
    
public class RenderOutPut : CompositeControl
    {
        
private Label _lblUser;
        
private Label _lblPassWrod;
        
private TextBox _txtUser;
        
private TextBox _txtPassWord;
        
private Button _bntOK;
        
private Button _bntReset;

        
public RenderOutPut()
        { }

        [Category(
"LabelTextBox")]
        [Description(
"用户名标签信息显示")]
        
public string lblUserText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._lblUser.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._lblUser.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"密码标签信息显示")]
        
public string lblPassWrodText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._lblPassWrod.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._lblPassWrod.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"用户名信息显示")]
        
public string txtUserText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._txtUser.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._txtUser.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"密码信息显示")]
        
public string txtPassWordText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._txtPassWord.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._txtPassWord.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"确认按钮信息显示")]
        
public string bntOKText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._bntOK.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._bntOK.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"重设按钮信息显示")]
        
public string bntResetText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._bntReset.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._bntReset.Text = value;
            }

        }

        
/// <summary>
        
/// 生成控件
        
/// </summary>
        protected override void CreateChildControls()
        {
            
this.Controls.Clear();

            _lblUser 
= new Label();
            _lblUser.Text 
= "用户名: ";
            _lblUser.Height 
= Unit.Pixel(18);  //高度与长度的数值你们按自己的意愿去调
            _lblUser.ID = "lblUser";
            
this.Controls.Add(_lblUser);

            _lblPassWrod 
= new Label();
            _lblPassWrod.Text 
= "密 码: ";
            _lblPassWrod.Height 
= Unit.Pixel(18);
            _lblPassWrod.ID 
= "lblPassWrod";
            
this.Controls.Add(_lblPassWrod);

            _txtUser 
= new TextBox();
            _txtUser.Width 
= Unit.Pixel(100);
            _txtUser.Height 
= Unit.Pixel(18);
            _txtUser.ID 
= "txtUser1";
            
this.Controls.Add(_txtUser);

            _txtPassWord 
= new TextBox();
            _txtPassWord.Width 
= Unit.Pixel(100);
            _txtPassWord.TextMode 
= TextBoxMode.Password;
            _txtPassWord.Height 
= Unit.Pixel(18);
            _txtPassWord.ID 
= "txtPassWord";
            
this.Controls.Add(_txtPassWord);

            _bntOK 
= new Button();
            _bntOK.Text 
= " OK ";
            _bntOK.ID 
= "bntOK";
            
this.Controls.Add(_bntOK);

            _bntReset 
= new Button();
            _bntReset.Text 
= "Reset";
            _bntReset.ID 
= "bntReset";
            
this.Controls.Add(_bntReset);

            
this.ChildControlsCreated = true;
        }

        
protected override void RecreateChildControls()
        {
            
if (this.ChildControlsCreated == false)
            {
                
base.RecreateChildControls();
            }
        }

        
/// <summary>
        
/// 输出控件
        
/// </summary>
        
/// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
                writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, 
"0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, 
" 0");
                writer.AddAttribute(HtmlTextWriterAttribute.Border, 
"0");
                writer.RenderBeginTag(HtmlTextWriterTag.Table);

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第一行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.Write(
"用户注册");
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.Write(
"");
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第一行结束

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第一行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._lblUser.RenderControl(writer);
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._txtUser.RenderControl(writer);
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第一行结束

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第二行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._lblPassWrod.RenderControl(writer);
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._txtPassWord.RenderControl(writer);
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第二行结束

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第三行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._bntOK.RenderControl(writer);
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._bntReset.RenderControl(writer);
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第三行结束

                writer.RenderEndTag(); 
//结束table
        }
    }
}

注意:  上面代码中Category与Description就是属性的设计时特性,下面列出部分.NET提供的特性:
 

.NET Framework为控件设计时属性提供了很多丰富的类,这些属性的功能非常灵活,控制范围广泛,比如可以控制该属性在属性窗口中的显示模式,如:是否在属性窗口中显示该属性,也可以指定此属性必须接收值类型描述,按组分类等,也可以控制文本的标记呈现格式等,甚至可以自己定义一个属性类,实现自己想实现的功能。下面讲一下常用的.NET Framework的属性类对控件的支持功能。

1 Bindable

指定属性是否可以绑定一个有效数据源,通常使用布尔值进行设置。例如:Bindable(true)。如果使用值true标记属性,表示该属性可以绑定一个有效数据源。

2 Browsable

指定属性是否应该在属性窗口中显示,使用布尔值设置。一般情况下,对于常用的和比较重要的属性设置Browsable为true,否则,设置Browsable为false。

3 EditorBrowsable

设置属性在编辑器中的可见性,比如设置在智能提示列表不显示或高级用户才可以看到该属性。

4 Category

指定属性在属性浏览器中进行分组显示的类别。该设计时特性帮助可视化编辑器将属性进行逻辑分组。通常分为:外观(Appearance)、行为(Behavior)、布局(Layout)、数据(Data)、操作(Action)、键盘(Key)和鼠标(Mouse)等。如果您安装的是中文版的IDE,则默认情况下中文分类和英文分类是通用的,即设置成“数据”或“Data”类别是等价的。

5 Description

设置显示在属性窗口最下面的描述属性功能的文字说明。

6 DesignOnly

如果此属性设置为true,表示该属性只能在设计期间使用,不能在页面代码中设置其值。

7 ReadOnly

设置该属性是否为只读状态。如果此特性设置为true,则在属性窗口能看到属性,但不能设置其值。另外,通过在属性语句体中把 set 语句段去掉也可以起到相同的效果。

8 Themeable

设置该属性是否支持主题特性,默认情况下属性都支持主题。当该属性与界面无关时可以设置其值为false,禁用该属性的主题功能。

9 DesignerSerializationVisibility

指定属性是否以及如何在代码中序列化,其值为DesignerSerializationVisibility的枚举值,存在3种设置方式:

10 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不应该序列化属性值;

11 DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列化程序序列化属性的值;

12 DesignerSerializationVisibility(DesignerSerializationVisibility.Content)指定序列化程序应该序列化属性的内容,而不是属性本身。此字段为只读。Visible为其默认值。

这里说的序列化是指在IDE中的设计器界面切换到代码视图时,看到的代码标记,或反向切换时把代码标记转化到设计器界面。后面讲复杂属性时会通过示例介绍此属性功能。

13 NotifyParentProperty

指示当此设计特性应用到的属性的值被修改时将通知其父属性。换言之,如果属性的父属性应该在该属性值被修改时接到通知,则向该属性应用NotifyParentProperty特性。通常使用布尔值进行设置。一般常用于复杂属性,通知转换器更新到父级标记。

14 ParseChildren

使用该设计特性指示当在页面上以声明方式使用控件时,嵌套在服务器控件标记内的XML元素是应该视为属性还是应视为子控件。通常情况下,包含两种声明方式:

15 ParseChildren(true)表示将子XML元素作为服务器控件的属性分析;

16 ParseChildren(bool childrenasProperty, string defaultProperty),其中childrenasProperty和上面的方式中的布尔值参数意义相同,defaultProperty定义默认情况下将子控件分析为服务器控件的集合属性。

17 PersistChildren

该设计特性指示设计时是否应将服务器控件的子控件作为内部嵌套控件保持。如果该特性为PersistChildren(true),则将服务器控件的子控件作为嵌套服务器控件标记保持。如果为PersistChildren(false),则将该控件的属性作为嵌套元素保持。

18 PersistenceMode

指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性,共存在4种枚举设置方式:

19 PersistenceMode(PersistenceMode.Attribute)指定属性或事件保持为属性;

20 PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)指定属性作为服务器控件的唯一内部文本,如果属性值是HTML编码的,只能对字符串作这种指定;

21 PersistenceMode(PersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保持为内部文本,还指示将该属性定义为元素的默认属性,只能指定一个属性为默认属性;

22 PersistenceMode(PersistenceMode.InnerProperty)指定属性在服务器控件中保持为嵌套标记,通常用于复杂对象,它们具有自己的持久性属性。

关于以上4种标记的具体用法,下一节会详细介绍。

23 DefaultValue

指定属性的默认值。此特性的设置需要特别谨慎,假如设置的值不为空,则开发人员在使用时如果自己输入的值与默认值相同,则控件不会装载开发人员输入的值。也就是说此默认值不能指定为具有有效意义或业务意义的实际值。一般设置为空即可。

24 DisplayName

指定在属性窗口中显示的别名。此别名仅在属性窗口中看到,当转换器转换到代码视图,以及在页面后面的代码中编码还是以实际的属性名称为准,而不是以该别名为准。

25 ParenthesizedPropertyName

指定属性在属性窗口中显示时,是否带有括号,相当于在Category分组特性基础上的对属性窗口属性集的排序功能,如果不带括号该属性会自动排在该组的前面。

26 PasswordPropertyText

指定是否设置成密码文本。如果设置为true,则在属性窗口中输入的文本会用特定的密码符号显示,而不是显示原文本;另外,在代码视图中看到的仍为原文本。

27 TypeConverter

指定用作此特性所绑定到的对象的转换器的类型。用于转换的类必须从TypeConverter继承。使用ConverterTypeName属性来获取为该特性所绑定到的对象提供数据转换的类名。后面会通过代码示例讲解如何自定义一个自己的类型转换器。

28 Editor

指定该属性的编辑器,如系统的文件编辑器、文本编辑器、颜色编辑器,还有集合编辑器等,也可以自己实现编辑器,具体用法后面会讲到。

29 ToolBoxItem

此属性为类特性。属于工具箱属性,可以设置当前控件是否在工具箱中显示,以及所在工具箱项的类型名称等信息。默认生成的控件都显示在工具箱中。

30 ToolBoxData

此特性为类特性,即不是属性的特性,而是类的特性,设置位置也是在类的上面。ToolBoxData表示从工具箱中拖一个控件到设计界面上时默认显示标记格式,如:

[ToolboxData(" <{0}:ControlProperty runat=server> </{0}:ControlProperty>")]

可以修改参数字符串,定制为自己想要的格式,但要保证所添加的属性为有意义的属性。

31 DefaultProperty

此特性为类特性。它指定服务器控件的默认属性,例如:[DefaultProperty("Text")]。

指定用黑色粗体显示默认属性特性的属性名称。一般设置比较重要或常用的属性为默认的属性。如TextBox控件的Text属性。

32 DefaultEvent

此特性为类特性。指定服务器控件的默认事件,例如:[DefaultEvent("OnClicked")]。

指定用黑色粗体显示默认事件特性的事件名称。一般设置比较重要或常用的属性为默认的事件,如Button控件的OnClick事件。

33 ValidationProperty

此特性为类特性,指定该控件的哪个属性作为验证属性。当该控件与验证控件组合使用时,验证控件会自动验证该特性指定的属性。

34 AspNetHostingPermission

此属性为JIT编译时代码访问安全属性。需要使用此属性确保链接到控件的代码具有适当的安全权限。Control类带有两个JIT编译时代码访问安全属性标记:

AspNetHostingPermission(SecurityAction.Demand,Level=AspNetHostingPermissionLevel.Minimal)

AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHosting.PermissionLevel.Minimal).在使用时应把第一个属性应用于当前开发的控件,第二个属性是可选的,因为继承请求是可传递的,在派生类中仍有效。

35 ControlBuilder

分析时特性,将自定义控件生成器与控件关联。只有在您希望使用自定义控件生成器,对页分析器用分析控件的声明性语法的默认逻辑进行修改时,才需要应用此特性。如果仅希望指定控件标记中的内容是否与属性或子控件对应,请使用ParseChildrenAttribute,而不要使用自定义控件生成器。

36 Designer
设计时特性,指定与控件关联的设计器类。控件设计器类用于控制关联的控件在可视化设计器的设计图面上的外观和行为。
下面就是这节的完整代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace ServerControl
{
    [DefaultProperty (
"TextBoxValue")]
    [ToolboxData (
"<{0}:RenderOutPut runat=server></{0}:RenderOutPut>")]
    
public class RenderOutPut : CompositeControl
    {
        
private Label _lblUser;
        
private Label _lblPassWrod;
        
private TextBox _txtUser;
        
private TextBox _txtPassWord;
        
private Button _bntOK;
        
private Button _bntReset;

        
public RenderOutPut()
        { }

        [Category(
"LabelTextBox")]
        [Description(
"用户名标签信息显示")]
        
public string lblUserText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._lblUser.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._lblUser.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"密码标签信息显示")]
        
public string lblPassWrodText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._lblPassWrod.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._lblPassWrod.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"用户名信息显示")]
        
public string txtUserText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._txtUser.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._txtUser.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"密码信息显示")]
        
public string txtPassWordText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._txtPassWord.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._txtPassWord.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"密码信息显示")]
        
public string bntOKText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._bntOK.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._bntOK.Text = value;
            }

        }

        [Category(
"LabelTextBox")]
        [Description(
"密码信息显示")]
        
public string bntResetText
        {
            
get
            {
                
this.EnsureChildControls();
                
return this._bntReset.Text;
            }
            
set
            {
                
this.EnsureChildControls();
                
this._bntReset.Text = value;
            }

        }

        
/// <summary>
        
/// 生成控件
        
/// </summary>
        protected override void CreateChildControls()
        {
            
this.Controls.Clear();

            _lblUser 
= new Label();
            _lblUser.Text 
= "用户名: ";
            _lblUser.Height 
= Unit.Pixel(18);  //高度与长度的数值你们按自己的意愿去调
            _lblUser.ID = "lblUser";
            
this.Controls.Add(_lblUser);

            _lblPassWrod 
= new Label();
            _lblPassWrod.Text 
= "密 码: ";
            _lblPassWrod.Height 
= Unit.Pixel(18);
            _lblPassWrod.ID 
= "lblPassWrod";
            
this.Controls.Add(_lblPassWrod);

            _txtUser 
= new TextBox();
            _txtUser.Width 
= Unit.Pixel(100);
            _txtUser.Height 
= Unit.Pixel(18);
            _txtUser.ID 
= "txtUser1";
            
this.Controls.Add(_txtUser);

            _txtPassWord 
= new TextBox();
            _txtPassWord.Width 
= Unit.Pixel(100);
            _txtPassWord.TextMode 
= TextBoxMode.Password;
            _txtPassWord.Height 
= Unit.Pixel(18);
            _txtPassWord.ID 
= "txtPassWord";
            
this.Controls.Add(_txtPassWord);

            _bntOK 
= new Button();
            _bntOK.Text 
= " OK ";
            _bntOK.ID 
= "bntOK";
            
this.Controls.Add(_bntOK);

            _bntReset 
= new Button();
            _bntReset.Text 
= "Reset";
            _bntReset.ID 
= "bntReset";
            
this.Controls.Add(_bntReset);

            
this.ChildControlsCreated = true;
        }

        
protected override void RecreateChildControls()
        {
            
if (this.ChildControlsCreated == false)
            {
                
base.RecreateChildControls();
            }
        }

        
/// <summary>
        
/// 输出控件
        
/// </summary>
        
/// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
                writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, 
"0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, 
" 0");
                writer.AddAttribute(HtmlTextWriterAttribute.Border, 
"0");
                writer.RenderBeginTag(HtmlTextWriterTag.Table);

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第一行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.Write(
"用户注册");
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.Write(
"");
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第一行结束

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第一行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._lblUser.RenderControl(writer);
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._txtUser.RenderControl(writer);
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第一行结束

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第二行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._lblPassWrod.RenderControl(writer);
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._txtPassWord.RenderControl(writer);
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第二行结束

                writer.RenderBeginTag(HtmlTextWriterTag.Tr); 
//第三行开始
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._bntOK.RenderControl(writer);
                writer.RenderEndTag();   
//第一个单元格结束
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                
this._bntReset.RenderControl(writer);
                writer.RenderEndTag();   
//第二个单元格结束
                writer.RenderEndTag();   //第三行结束

                writer.RenderEndTag(); 
//结束table
        }
    }
}


当然你也还可以添加设计字体,颜色等等属性,这就看你自己的需求了。  编译,把控件拖到Dafault.aspx页面,右键,查看控件的属性,如下图:


这节关于自定义属性的话题已经结束,下节将会更进一步讲解自定义属性比较复杂的实现方法。欢迎大家指正文中的错误,一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值