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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI.WebControls;
  6. using System.ComponentModel;
  7. using System.Web.UI;
  8. using System.Text.RegularExpressions;
  9.  
  10. [assembly: TagPrefix("XXX.Web.Controls", "XXX")]
  11. namespace XXX.Web.Controls
  12. {
  13. [ToolboxData("<{0}:DecimalTextbox runat=server></{0}:DecimalTextbox>")]
  14. [Designer(typeof(XXX.Web.Controls.DecimalTextbox))]
  15. public class DecimalTextbox : TextBox
  16. {
  17. protected override void OnInit(EventArgs e)
  18. {
  19. base.OnInit(e);
  20. }
  21.  
  22. #region New properties
  23.  
  24. private bool _IsRequired = false;
  25.  
  26. [TypeConverter(typeof(BooleanConverter))]
  27. public bool IsRequired
  28. {
  29. get
  30. {
  31. if (ViewState[this.ID + "_IsRequired"] != null)
  32. {
  33. return (bool)ViewState[this.ID + "_IsRequired"];
  34. }
  35. else
  36. {
  37. ViewState[this.ID + "_IsRequired"] = this._IsRequired;
  38. return this._IsRequired;
  39. }
  40. }
  41. set
  42. {
  43. ViewState[this.ID + "_IsRequired"] = value;
  44. }
  45. }
  46.  
  47. [TypeConverter(typeof(DecimalConverter))]
  48. public decimal Value
  49. {
  50. get
  51. {
  52. Regex reg = new Regex(this.ValidationExpression);
  53. if (reg.IsMatch(this.RawText))
  54. {
  55. return Convert.ToDecimal(base.Text.Replace(",", "").Replace("$", ""));
  56. }
  57. else
  58. {
  59. return ;
  60. }
  61. }
  62. }
  63.  
  64. 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+)?$";
  65.  
  66. [TypeConverter(typeof(StringConverter))]
  67. public string ValidationExpression
  68. {
  69. get
  70. {
  71. if (ViewState[this.ID + "_ValidationExpression"] != null)
  72. {
  73. return (string)ViewState[this.ID + "_ValidationExpression"];
  74. }
  75. else
  76. {
  77. ViewState[this.ID + "_ValidationExpression"] = this._ValidationExpression;
  78. return this._ValidationExpression;
  79. }
  80. }
  81. set
  82. {
  83. ViewState[this.ID + "_ValidationExpression"] = value;
  84. }
  85. }
  86.  
  87. private bool _IsNeedThousandSeparator = true;
  88.  
  89. [TypeConverter(typeof(BooleanConverter))]
  90. public bool IsNeedThousandSeparator
  91. {
  92. get
  93. {
  94. if (ViewState[this.ID + "_IsNeedThousandSeparator"] != null)
  95. {
  96. return (bool)ViewState[this.ID + "_IsNeedThousandSeparator"];
  97. }
  98. else
  99. {
  100. ViewState[this.ID + "_IsNeedThousandSeparator"] = this._IsNeedThousandSeparator;
  101. return this._IsNeedThousandSeparator;
  102. }
  103. }
  104. set
  105. {
  106. ViewState[this.ID + "_IsNeedThousandSeparator"] = value;
  107. }
  108. }
  109.  
  110. private int _DecimalPlaces = ;
  111.  
  112. [TypeConverter(typeof(Int32Converter))]
  113. public int DecimalPlaces
  114. {
  115. get
  116. {
  117. if (ViewState[this.ID + "_DecimalPlaces"] != null)
  118. {
  119. return (int)ViewState[this.ID + "_DecimalPlaces"];
  120. }
  121. else
  122. {
  123. ViewState[this.ID + "_DecimalPlaces"] = this._DecimalPlaces;
  124. return this._DecimalPlaces;
  125. }
  126. }
  127. set
  128. {
  129. ViewState[this.ID + "_DecimalPlaces"] = value;
  130. }
  131. }
  132.  
  133. private bool _IsNeedDollarSignal = false;
  134.  
  135. [TypeConverter(typeof(BooleanConverter))]
  136. public bool IsNeedDollarSignal
  137. {
  138. get
  139. {
  140. if (ViewState[this.ID + "_IsNeedDollarSignal"] != null)
  141. {
  142. return (bool)ViewState[this.ID + "_IsNeedDollarSignal"];
  143. }
  144. else
  145. {
  146. ViewState[this.ID + "_IsNeedDollarSignal"] = this._IsNeedDollarSignal;
  147. return this._IsNeedDollarSignal;
  148. }
  149. }
  150. set
  151. {
  152. ViewState[this.ID + "_IsNeedDollarSignal"] = value;
  153. }
  154. }
  155.  
  156. private string _DollarSignal = "$";
  157.  
  158. [TypeConverter(typeof(StringConverter))]
  159. public string DollarSignal
  160. {
  161. get
  162. {
  163. if (ViewState[this.ID + "_DollarSignal"] != null)
  164. {
  165. return (string)ViewState[this.ID + "_DollarSignal"];
  166. }
  167. else
  168. {
  169. ViewState[this.ID + "_DollarSignal"] = this._DollarSignal;
  170. return this._DollarSignal;
  171. }
  172. }
  173. set
  174. {
  175. ViewState[this.ID + "_DollarSignal"] = value;
  176. }
  177. }
  178.  
  179. private string FormatString
  180. {
  181. get
  182. {
  183. string pre = string.Empty;
  184. if (this.IsNeedDollarSignal)
  185. {
  186. pre += this.DollarSignal;
  187. }
  188. if (this.IsNeedThousandSeparator)
  189. {
  190. pre += "#,###";
  191. }
  192. else
  193. {
  194. pre += "#";
  195. }
  196. if (this.DecimalPlaces > )
  197. {
  198. pre += ".";
  199. for (int i = ; i < this.DecimalPlaces; i++)
  200. {
  201. pre += "#";
  202. }
  203. pre += "";
  204. }
  205. return pre;
  206. }
  207. }
  208.  
  209. private string _RawText = string.Empty;
  210.  
  211. public string RawText
  212. {
  213. get
  214. {
  215. if (ViewState[this.ID + "_RawText"] != null)
  216. {
  217. return (string)ViewState[this.ID + "_RawText"];
  218. }
  219. else
  220. {
  221. ViewState[this.ID + "_RawText"] = this._RawText;
  222. return this._RawText;
  223. }
  224. }
  225. private set
  226. {
  227. ViewState[this.ID + "_RawText"] = value;
  228. }
  229. }
  230.  
  231. #endregion
  232.  
  233. #region Override properties
  234.  
  235. public override string SkinID
  236. {
  237. get
  238. {
  239. if (this.IsRequired)
  240. {
  241. return "DecimalRequired";
  242. }
  243. else
  244. {
  245. return "Decimal";
  246. }
  247. }
  248. set
  249. {
  250. base.SkinID = value;
  251. }
  252. }
  253.  
  254. public override string Text
  255. {
  256. get
  257. {
  258. return ToDecimalFormatString(base.Text);
  259. }
  260. set
  261. {
  262. this.RawText = value;
  263. base.Text = ToDecimalString(value);
  264. }
  265. }
  266.  
  267. #endregion
  268.  
  269. #region New functions
  270.  
  271. protected string ToDecimalString(string orignal)
  272. {
  273. Regex reg = new Regex(this.ValidationExpression);
  274. if (reg.IsMatch(orignal))
  275. {
  276. return orignal.Replace(",", "").Replace("$", "");
  277. }
  278. else
  279. {
  280. return string.Empty;
  281. }
  282. }
  283.  
  284. protected string ToDecimalFormatString(string orignal)
  285. {
  286. if (!string.IsNullOrEmpty(orignal))
  287. {
  288. return this.Value.ToString(FormatString);
  289. }
  290. return orignal;
  291. }
  292.  
  293. #endregion
  294. }
  295. }

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

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. [置顶] 创建GitHub技术博客全攻略

    [置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...

  2. C#几种截取字符串的方法小结 (摘抄)

    1.根据单个分隔字符用split截取 例如 string st="GT123_1"; string[] sArray=st.split("_"); 即可得到sA ...

  3. css-下拉菜单案例

    <!DOCTYPE html>CSS4-布局2-display下拉菜单案例 <style>.xiala{width:200px;background:#ddd;}.xiala ...

  4. jquery在火狐浏览中上传图片并显示

    由于火狐浏览器有很多代码无法兼容,特别是图片的显示,下面我介绍一种是我亲自测试过可以实现的方法 <script> function setImagePreview() { //var ix ...

  5. 转: 向tabControl中添加一个Form(C#)

  6. 值栈和OGNL 之 7.1 值栈

    7.1  值栈 7.1.1  值栈是什么 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Resu ...

  7. java 读取并且显示 txt 文件

    系统:mac os x 10.9 eclipse 在eclipse 中建立一个project, 命名为Cin_txt, Cin_txt的内容 test wang hello world 以下是输入的代 ...

  8. How to Use Javascript to Control Quicktime

    参看下面链接: How to Use Javascript to Control Quicktime;

  9. No1_2. 流程控制_java学习笔记

    import java.util.Scanner; import java.lang.Math; public class HelloForWhile { /** * 文档注释,程序名称:HelloF ...

  10. sshfs远程文件系统挂载

    注意:转载请注明出处: http://www.programfish.com/blog/?p=145 sshfs简介: 一种通过SSH协议访问远程文件系统的用户空间文件系统.可以把远程主机上的文件系统 ...