对自定义控件的几个理解

using System;
using System.Collections.Generic;
using System.Web;

/// <summary>
///Attribute 的摘要说明
/// </summary>
using System;
using System.Web.UI;
using System.ComponentModel;

namespace CustomComponents
{  
    /// <summary>
    /// [DefaultPropertyAttribute("CardholderNameText")]
    /// 指定组件的默认属性。
    /// 所有的特性实际上是类,按照约定,这些类的名字以'Attribute'结尾,
    /// DefaultProperrtyAttribute实际上是一个DefaultProperrtyAttribute类
    /// ToolboxDataAttribute 类
    /// 默认情况下,Visual Studio 等工具的可视化设计器创建空标记。
    /// 当将控件从可视化设计器的工具箱中拖放到设计图面时,这是表示该控件在默认状态时的标记。
    /// 若要指定初始默认值,控件可以利用此属性。可以使用此属性自定义初始 HTML 内容;当将控件从工具箱中拖动到窗体上时,这些内容将放
    /// 指定当从 Microsoft Visual Studio 等工具中的工具箱拖动自定义控件时为它生成的默认标记。
    /// [ ToolboxData("<{0}:MyLabel runat= server Text=
    /// MyLabel><{0}:MyLabel>") ]
    /// </summary>
    [DefaultPropertyAttribute("CardholderNameText")]
    [ToolboxData(@"<{0}:CreditCardForm2
    PaymentMethodText='信用卡类型' CreditCardNoText='信用卡卡号'
    CardholderNameText='信用卡持有者姓名' SubmitButtonText = '提交' 
    runat='server'></{0}:CreditCardForm2>")
    ]
    public class CreditCardForm2 : Control
    {
        private string paymentMethodText = "信用卡类型";
        private string creditCardNoText = "信用卡卡号";
        private string cardholderNameText = "信用卡持有者姓名";
        private string expirationDateText = "最后使用时间";
        private string submitButtonText = "提交";

        /// <summary>
        /// BrowsableAttribute 类
        /// 指定一个属性 (Property) 或事件是否应显示在“属性”窗口中。
        /// [Browsable(true)]
        /// DescriptionAttribute 类
        /// 指定属性 (Property) 或事件的说明
        /// DefaultValueAttribute 类
        /// 指定属性 (Property) 的默认值
        /// [DefaultValue(false)]
        /// CategoryAttribute 类
        /// 指定当属性 (Property) 或事件显示在一个设置为“按分类顺序”模式的 PropertyGrid 控件中时,
        /// 用于给属性或事件分组的类别的名称
        /// 一个 CategoryAttribute,它指示在一个设置为 Categorized 模式的 PropertyGrid 控件中列出属性 (Property) 或事件时,
        /// 将关联的属性 (Property) 或事件与之关联的类别。
        /// 如果没有对属性或事件应用 CategoryAttribute,则 PropertyGrid 将属性 (Property) 或事件与“杂项”类别关联。
        /// 通过在 CategoryAttribute 的构造函数中指定类别的名称,可以为任何名称创建新的类别。
        ///Category 属性 (Property) 指示该属性 (Attribute) 所代表的类别的名称。Category 属性 (Property) 还以透明方式对类别名称进行本地化。
        ///
        /// </summary>
        [BrowsableAttribute(true)]
        [DescriptionAttribute("获取和设置信用卡类型")]
        [DefaultValueAttribute("信用卡类型")]
        [CategoryAttribute("Appearance")]
        public virtual string PaymentMethodText
        {
            get { return this.paymentMethodText; }
            set { this.paymentMethodText = value; }
        }

        [BrowsableAttribute(true)]
        [DescriptionAttribute("获取或设置信用卡卡号")]
        [DefaultValueAttribute("信用卡卡号")]
        [CategoryAttribute("Appearance")]
        public virtual string CreditCardNoText
        {
            get { return this.creditCardNoText; }
            set { this.creditCardNoText = value; }
        }

        [BrowsableAttribute(true)]
        [DescriptionAttribute("获取或设置信用卡持有者姓名")]
        [DefaultValueAttribute("信用卡持有者姓名")]
        [CategoryAttribute("Appearance")]
        public virtual string CardholderNameText
        {
            get { return this.cardholderNameText; }
            set { this.cardholderNameText = value; }
        }

        [BrowsableAttribute(true)]
        [DescriptionAttribute("获取或设置最后使用时间")]
        [DefaultValueAttribute("最后使用时间")]
        [CategoryAttribute("Appearance")]
        public virtual string ExpirationDateText
        {
            get { return this.expirationDateText; }
            set { this.expirationDateText = value; }
        }

        [BrowsableAttribute(true)]
        [DescriptionAttribute("获取或设置按钮标签")]
        [DefaultValueAttribute("提交")]
        [CategoryAttribute("Appearance")]
        public virtual string SubmitButtonText
        {
            get { return this.submitButtonText; }
            set { this.submitButtonText = value; }
        }

        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("<table style='width:287px;height:124px;border-width:0;'>");
            writer.Write("<tr>");
            writer.Write("<td>" + PaymentMethodText + "</td>");
            writer.Write("<td>");
            writer.Write("<select name='PaymentMethod' id='PaymentMethod' style='width:100%;'>");
            writer.Write("<option value='0'>Visa</option>");
            writer.Write("<option value='1'>MasterCard</option>");
            writer.Write("</select>");
            writer.Write("</td>");
            writer.Write("</tr>");
            writer.Write("<tr>");
            writer.Write("<td>" + CreditCardNoText + "</td>");
            writer.Write("<td><input name='CreditCardNo' id='CreditCardNo' type='text' /></td>");
            writer.Write("</tr>");
            writer.Write("<tr>");
            writer.Write("<td>" + CardholderNameText + "</td>");
            writer.Write("<td><input name='CardholderName' id='CardholderName' type='text' /></td>");
            writer.Write("</tr>");
            writer.Write("<tr>");
            writer.Write("<td>" + ExpirationDateText + "</td>");
            writer.Write("<td>");
            writer.Write("<select name='Month' id='Month'>");
            for (int day = 1; day < 13; day++)
            {
                if (day < 10)
                    writer.Write("<option value='" + day.ToString() + "'>" + "0" + day.ToString() + "</option>");
                else
                    writer.Write("<option value='" + day.ToString() + "'>" + day.ToString() + "</option>");
            }
            writer.Write("</select>");
            writer.Write("&nbsp");
            writer.Write("<select name='Year' id='Year'>");
            for (int year = 2005; year < 2015; year++)
            {
                writer.Write("<option value='" + year.ToString() + "'>" + year.ToString() + "</option>");
            }
            writer.Write("</select>");
            writer.Write("</td>");
            writer.Write("</tr>");
            writer.Write("<tr>");
            writer.Write("<td align='center' colspan='2'>");
            writer.Write("<input type='submit' value='" + SubmitButtonText + "' />");
            writer.Write("</td>");
            writer.Write("</tr>");
            writer.Write("</table>");

            base.Render(writer);
        }
    }
}

 

posted on 2009-03-29 00:00  centerqi  阅读(383)  评论(0编辑  收藏  举报

导航