以下是一个相对简陋的扩展, 主要是针对金额显示的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 ;
}
}
} 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 = ; [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 > )
{
pre += ".";
for (int i = ; i < this.DecimalPlaces; i++)
{
pre += "#";
}
pre += "";
}
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
}
}

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

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)]

关于继承扩展ASP.NET控件(以Textbox为例)的更多相关文章

  1. asp.net控件开发基础(1)(转)原文更多内容

    asp.net本身提供了很多控件,提供给我们这些比较懒惰的人使用,我认为控件的作用就在此,因为我们不想重复工作,所以要创建它,这个本身便是一个需求的关系,所以学习控件开发很有意思. wrox网站上有本 ...

  2. Asp.Netserver控件开发的Grid实现(三)列编辑器

    以下是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; usin ...

  3. 为ASP.NET控件加入快捷菜单

    ContextMenu Control 快捷菜单控件概述: MSDN Liabrary 中包含了几个DHTML快捷菜单的示例.分别提供了对这一功能的不能实现方法.一个快捷菜单就是在页面中任何位置的一组 ...

  4. Asp.Net控件的客户端命名

    我们在用ASP.NET写出来的网页,用浏览器来查看生成的客户端代码的时候经常看到这样的代码:GridView1_ctl101_WebUserControl1_webuserControlButton, ...

  5. asp.net <asp:Content>控件

    <asp:Content ID="Content2" ContentPlaceHolderID="CPH_MainContent" runat=" ...

  6. FineUI 基于 ExtJS 的专业 ASP.NET 控件库

    FineUI 基于 ExtJS 的专业 ASP.NET 控件库 http://www.fineui.com/

  7. ASP.NET控件<ASP:Button /> html控件<input type="button">区别联系

    ASP.NET控件<ASP:Button />-------html控件<input type="button">杨中科是这么说的:asp和input是一样 ...

  8. asp.net控件的Hyperlink控件

    Asp.net控件: Hyperlink控件:Hyperlink控件又称为超链接控件,该控件在功能上跟Html的<a herf=””>控件相似,其显示的模式为超链接的形式. 注意: Hyp ...

  9. 把某个asp.net 控件 替换成 自定义的控件

    功能:可以把某个asp.net 控件 替换成 自定义的控件 pages 的 tagMapping 元素(ASP.NET 设置架构) 定义一个标记类型的集合,这些标记类型在编译时重新映射为其他标记类型. ...

随机推荐

  1. html5 video播放不全屏

    <video controls="controls" webkit-playsinline src="${page.videoUrl }" type=&q ...

  2. ORACLE数据库常用查询二

    ORACLE数据库常用查询 1.查看表空间对应数据文件情况: SQL MB,AUTOEXTENSIBLE FROM DBA_DATA_FILES; TABLESPACE_NAME FILE_NAME ...

  3. C#/.Net Post获取数据流的一种简单写法

    最近在弄一些第三方的平台,经常调用第三方的接口实现某些特定的功能 在实现的同时基本上都需要本地的数据经过服务器在Request到第三方的服务器中处理,再返回相应的数据结构体:json/xml 以下是我 ...

  4. Android 控件 -------- AutoCompleteTextView 动态匹配内容,例如 百度搜索提示下拉列表功能

    AutoCompleteTextView 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据.两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开 ...

  5. iOS 证书错误 Certificates下面的 App Store and Ad Hoc是灰的?? 点不了

    原因 因为一个用户名下只能同时有一个发布证书,你之前建立了某个证书并且没有使用的话就无法再创建了,先把它撤销或者使用后才可以继续创建新的

  6. 自定义UIView动画效果

    最普通动画: //开始动画 [UIView beginAnimations:nil context:nil]; //设定动画持续时间 [UIView setAnimationDuration:]; / ...

  7. iOS学习资料整理

    视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...

  8. NPOI通过DataTable导出和读取Excel

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...

  9. iOS Layer CABasicAnimation

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  10. bochs 2.6安装和使用

    1.安装 Ubuntu 10.04下编译安装Bochs 2.6及问题解决 安装 https://chaoyang.blog.ustc.edu.cn/index.php/archives/124 安装具 ...