关于继承扩展ASP.NET控件(以Textbox为例)

以下是一个相对简陋的扩展, 主要是针对金额显示的Textbox扩展.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;
using System.Text.RegularExpressions;

[assembly: TagPrefix("XXX.Web.Controls", "XXX")]
namespace XXX.Web.Controls
{
    [ToolboxData("<{0}:DecimalTextbox runat=server></{0}:DecimalTextbox>")]
    [Designer(typeof(XXX.Web.Controls.DecimalTextbox))]
    public class DecimalTextbox : TextBox
    {
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
        }

        #region New properties

        private bool _IsRequired = false;

        [TypeConverter(typeof(BooleanConverter))]
        public bool IsRequired
        {
            get
            {
                if (ViewState[this.ID + "_IsRequired"] != null)
                {
                    return (bool)ViewState[this.ID + "_IsRequired"];
                }
                else
                {
                    ViewState[this.ID + "_IsRequired"] = this._IsRequired;
                    return this._IsRequired;
                }
            }
            set
            {
                ViewState[this.ID + "_IsRequired"] = value;
            }
        }

        [TypeConverter(typeof(DecimalConverter))]
        public decimal Value
        {
            get
            {
                Regex reg = new Regex(this.ValidationExpression);
                if (reg.IsMatch(this.RawText))
                {
                    return Convert.ToDecimal(base.Text.Replace(",", "").Replace("$", ""));
                }
                else
                {
                    return 0;
                }
            }
        }

        private string _ValidationExpression = @"^$?-?[1-9]d*$|^$?-?0(.d+)$|^$?-?[1-9]d*(.d+)$|^$?-?([1-9]{0,3},)(d{3},)*(d{3})(.d+)?$|^$?-?0(.d+)?$|^$?-?[1-9]d{0,2}(.d+)?$";

        [TypeConverter(typeof(StringConverter))]
        public string ValidationExpression
        {
            get
            {
                if (ViewState[this.ID + "_ValidationExpression"] != null)
                {
                    return (string)ViewState[this.ID + "_ValidationExpression"];
                }
                else
                {
                    ViewState[this.ID + "_ValidationExpression"] = this._ValidationExpression;
                    return this._ValidationExpression;
                }
            }
            set
            {
                ViewState[this.ID + "_ValidationExpression"] = value;
            }
        }

        private bool _IsNeedThousandSeparator = true;

        [TypeConverter(typeof(BooleanConverter))]
        public bool IsNeedThousandSeparator
        {
            get
            {
                if (ViewState[this.ID + "_IsNeedThousandSeparator"] != null)
                {
                    return (bool)ViewState[this.ID + "_IsNeedThousandSeparator"];
                }
                else
                {
                    ViewState[this.ID + "_IsNeedThousandSeparator"] = this._IsNeedThousandSeparator;
                    return this._IsNeedThousandSeparator;
                }
            }
            set
            {
                ViewState[this.ID + "_IsNeedThousandSeparator"] = value;
            }
        }

        private int _DecimalPlaces = 2;

        [TypeConverter(typeof(Int32Converter))]
        public int DecimalPlaces
        {
            get
            {
                if (ViewState[this.ID + "_DecimalPlaces"] != null)
                {
                    return (int)ViewState[this.ID + "_DecimalPlaces"];
                }
                else
                {
                    ViewState[this.ID + "_DecimalPlaces"] = this._DecimalPlaces;
                    return this._DecimalPlaces;
                }
            }
            set
            {
                ViewState[this.ID + "_DecimalPlaces"] = value;
            }
        }

        private bool _IsNeedDollarSignal = false;

        [TypeConverter(typeof(BooleanConverter))]
        public bool IsNeedDollarSignal
        {
            get
            {
                if (ViewState[this.ID + "_IsNeedDollarSignal"] != null)
                {
                    return (bool)ViewState[this.ID + "_IsNeedDollarSignal"];
                }
                else
                {
                    ViewState[this.ID + "_IsNeedDollarSignal"] = this._IsNeedDollarSignal;
                    return this._IsNeedDollarSignal;
                }
            }
            set
            {
                ViewState[this.ID + "_IsNeedDollarSignal"] = value;
            }
        }

        private string _DollarSignal = "$";

        [TypeConverter(typeof(StringConverter))]
        public string DollarSignal
        {
            get
            {
                if (ViewState[this.ID + "_DollarSignal"] != null)
                {
                    return (string)ViewState[this.ID + "_DollarSignal"];
                }
                else
                {
                    ViewState[this.ID + "_DollarSignal"] = this._DollarSignal;
                    return this._DollarSignal;
                }
            }
            set
            {
                ViewState[this.ID + "_DollarSignal"] = value;
            }
        }

        private string FormatString
        {
            get
            {
                string pre = string.Empty;
                if (this.IsNeedDollarSignal)
                {
                    pre += this.DollarSignal;
                }
                if (this.IsNeedThousandSeparator)
                {
                    pre += "#,###";
                }
                else
                {
                    pre += "#";
                }
                if (this.DecimalPlaces > 0)
                {
                    pre += ".";
                    for (int i = 1; i < this.DecimalPlaces; i++)
                    {
                        pre += "#";
                    }
                    pre += "0";
                }
                return pre;
            }
        }

        private string _RawText = string.Empty;

        public string RawText
        {
            get
            {
                if (ViewState[this.ID + "_RawText"] != null)
                {
                    return (string)ViewState[this.ID + "_RawText"];
                }
                else
                {
                    ViewState[this.ID + "_RawText"] = this._RawText;
                    return this._RawText;
                }
            }
            private set
            {
                ViewState[this.ID + "_RawText"] = value;
            }
        }

        #endregion

        #region Override properties

        public override string SkinID
        {
            get
            {
                if (this.IsRequired)
                {
                    return "DecimalRequired";
                }
                else
                {
                    return "Decimal";
                }
            }
            set
            {
                base.SkinID = value;
            }
        }

        public override string Text
        {
            get
            {
                return ToDecimalFormatString(base.Text);
            }
            set
            {
                this.RawText = value;
                base.Text = ToDecimalString(value);
            }
        }

        #endregion

        #region New functions

        protected string ToDecimalString(string orignal)
        {
            Regex reg = new Regex(this.ValidationExpression);
            if (reg.IsMatch(orignal))
            {
                return orignal.Replace(",", "").Replace("$", "");
            }
            else
            {
                return string.Empty;
            }
        }

        protected string ToDecimalFormatString(string orignal)
        {
            if (!string.IsNullOrEmpty(orignal))
            {
                return this.Value.ToString(FormatString);
            }
            return orignal;
        }

        #endregion
    }
}
View Code

有一下几个自定义属性可以设置:

IsRequired="True" 是否必填, 我这里只是控制SkinID.
IsNeedThousandSeparator="True" 这里是控制是否显示千位符

DecimalPlaces="2" 这里是控制小数位数 

IsNeedDollarSignal="False" 这里是控制是否显示$符号

求助:

ASP.NET自带的控件, 用Toolbox拖入, 某些属性例如"Text"会显示在插入的控件页面代码上

若我现在有一个自定义的属性想在拖入页面的时候, 就在页面代码上就出现(包括默认值). 不知道如何实现, 希望高人指点.

backup:

//writer.AddAttribute("IsRequired", this.IsRequired.ToString());
//writer.AddAttribute("SkinID", this.SkinID.ToString());
//[DescriptionAttribute("一个基于 Textbox 的对Decimal特殊处理的派生控件")]
//[ParseChildren(false)]
//[PersistChildren(true)]
//[DefaultProperty("Value")]
//[DefaultValue(false)]
//[Description("是否必填, 将出现必填样式")]
//[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
//[PersistenceMode(PersistenceMode.InnerProperty)]

原文地址:https://www.cnblogs.com/xachary/p/3732262.html