• 关于继承扩展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)]

  • 相关阅读:
    常用MySQL函数连接
    spring boot和mybatis的多源配置亲测可用非常简单哦铁闸门
    RestTemplate请求发送post请求携带数组参数(亲测有效)
    idea配置tomcat
    前后端分离生成手机验证码
    前后端分离的图片验证保存及发送方式
    Java—大文件分片上传
    SpringAOP实战
    Spring Boot AOP的使用
    iOS开发日常记录
  • 原文地址:https://www.cnblogs.com/xachary/p/3732262.html
Copyright © 2020-2023  润新知