您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz重写的TextBox控件分析
陈茗卓2025-07-02Discuz教程已有人查阅
导读Discuz重写的TextBox控件,非常好用,就是看不懂,有高手能看懂的,给解释下!using System;using System.Collections;using System.Web.UI;
Discuz重写的TextBox控件,非常好用,就是看不懂,有高手能看懂的,给解释下!
using System;
using System.Collections;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
namespace Discuz.Admin.Controls
{
/// <summary>
/// TextBox 控件
/// </summary>
[DefaultProperty("Text"),ToolboxData("<{0}:TextBox runat=server></{0}:TextBox>")]
public class TextBox : System.Web.UI.WebControls.WebControl,IPostBackDataHandler
{
protected System.Web.UI.WebControls.TextBox tb=new System.Web.UI.WebControls.TextBox();
protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1=new RequiredFieldValidator();
protected System.Web.UI.WebControls.RegularExpressionValidator RegularExpressionValidator1=new RegularExpressionValidator();
protected System.Web.UI.WebControls.RangeValidator rangevalidator=new System.Web.UI.WebControls.RangeValidator();
public TextBox(): base()
{
tb.Attributes.Add("onfocus","this.className='colorfocus';");
tb.Attributes.Add("onblur","this.className='colorblur';");
tb.CssClass="colorblur";
}
public void AddAttributes(string key ,string valuestr)
{
tb.Attributes.Add(key,valuestr);
}
//在属性RequiredFieldType后进行调用
public void SetValiateControls()
{
this.Controls.Add(tb);
if((RequiredFieldType!=null)&&(RequiredFieldType!="")&&(RequiredFieldType!="暂无校验"))
{
RegularExpressionValidator1.Display=System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
RegularExpressionValidator1.ControlToValidate=tb.ID;
RegularExpressionValidator1.ForeColor = System.Drawing.Color.Black;
switch (RequiredFieldType)
{
case "数据校验":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:"^[-]?\\d+[.]?\\d*$";
RegularExpressionValidator1.ErrorMessage=" 数字的格式不正确";break;
}
case "电子邮箱":
{ //RegularExpressionValidator1.ValidationExpression="^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$";
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
RegularExpressionValidator1.ErrorMessage=" 邮箱的格式不正确";break;
}
case "移动手机":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:"\\d{11}";
RegularExpressionValidator1.ErrorMessage=" 手机的位数应为11位!";break;
}
case "家用电话":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:"((\\(\\d{3}\\) ?)|(\\d{3}-))?\\d{3}-\\d{4}|((\\(\\d{3}\\) ?)|(\\d{4}-))?\\d{4}-\\d{4}";
RegularExpressionValidator1.ErrorMessage=" 请依 (XXX)XXX-XXXX 格式或 (XXX)XXXX-XXXX 输入电话号码!";break;
}
case "身份证号码":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:"^\\d{15}$|^\\d{18}$";
RegularExpressionValidator1.ErrorMessage=" 请依15或18位数据的身份证号!";break;
}
case "网页地址":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:@"^(http|https)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{1,10}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$";
RegularExpressionValidator1.ErrorMessage=" 请输入正确的网址";break;
}
case "日期":
{ //RegularExpressionValidator1.ValidationExpression="\\d{4}-\\d{1,2}-\\d{1,2}";
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:@"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$";
RegularExpressionValidator1.ErrorMessage=" 请输入正确的日期,如:2006-1-1";break;
}
case "日期时间":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:@"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$";
RegularExpressionValidator1.ErrorMessage=" 请输入正确的日期,如: 2006-1-1 23:59:59";break;
}
case "金额":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:"^([0-9]|[0-9].[0-9]{0-2}|[1-9][0-9]*.[0-9]{0,2})$";
RegularExpressionValidator1.ErrorMessage=" 请输入正确的金额";break;
}
case "IP地址":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:@"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$";
RegularExpressionValidator1.ErrorMessage=" 请输入正确的IP地址";break;
}
case "IP地址带端口":
{
RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?this.ValidationExpression:@"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9]):\d{1,5}?$";
RegularExpressionValidator1.ErrorMessage=" 请输入正确的带端口的IP地址";break;
}
}
this.Controls.Add(RegularExpressionValidator1);
}
switch (CanBeNull)
{
case "可为空": { break; }
case "必填":
{
RequiredFieldValidator1.Display=System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
RequiredFieldValidator1.ControlToValidate=tb.ID;
RequiredFieldValidator1.ForeColor=System.Drawing.Color.Black;
RequiredFieldValidator1.ErrorMessage="请务必输入内容!";
this.Controls.Add(RequiredFieldValidator1);
break;
}
default : { break; }
}
this.BorderStyle=BorderStyle.Dotted;
this.BorderWidth=1;
}
[Bindable(true),Category("Appearance"),DefaultValue("")]
public string SetFocusButtonID
{
get
{
object o = ViewState[this.ClientID+"_SetFocusButtonID"];
return (o==null)?"":o.ToString();
}
set
{
ViewState[this.ClientID+"_SetFocusButtonID"] = value;
if(value!="")
{
tb.Attributes.Add("onkeydown","if(event.keyCode==13){document.getElementById('"+value+"').focus();}");
}
}
}
[Bindable(true),Category("Appearance"),DefaultValue("")]
public override string ID
{
get
{
return tb.ID;
}
set
{
tb.ID = value;
}
}
//调控件的最大长度属性
[Bindable(true),Category("Appearance"),DefaultValue("")]
public int MaxLength
{
get
{
object o =ViewState["TextBox_MaxLength"];
if(o!=null)
{
int maxlength= Convert.ToInt32(o.ToString());
AddAttributes("maxlength",maxlength.ToString());
return maxlength;
}
else
{
return -1;
}
}
set
{
ViewState["TextBox_MaxLength"] = value;
AddAttributes("maxlength",value.ToString());
}
}
//调控件的TextMode属性
[Bindable(false),Category("Behavior"),DefaultValue(""),TypeConverter(typeof(TextModeFieldTypeControlsConverter)),Description("要滚动的对象。")]
public string TextMode //要进行校验的表达式
{
get
{
return tb.TextMode.ToString();
}
set
{
if (value=="Password") tb.TextMode =TextBoxMode.Password;
if (value=="MultiLine")
{
tb.TextMode =TextBoxMode.MultiLine;
tb.Attributes.Add("onkeyup","return isMaxLen(this)");
}
if (value=="SingleLine") tb.TextMode =TextBoxMode.SingleLine;
}
}
[Bindable(false),Category("Behavior"),DefaultValue(""),TypeConverter(typeof(RequiredFieldTypeControlsConverter)),Description("要滚动的对象。")]
public string RequiredFieldType //要进行校验的表达式
{
get
{
object o = ViewState["RequiredFieldType"];
return (o==null)?"":o.ToString();
}
set
{
ViewState["RequiredFieldType"] = value;
SetValiateControls();
}
}
[Bindable(false),Category("Behavior"),DefaultValue("可为空"),TypeConverter(typeof(CanBeNullControlsConverter)),Description("要滚动的对象。")]
public string CanBeNull //要表达式是否可以为空
{
get
{
object o = ViewState["CanBeNull"];
return (o==null)?"":o.ToString();
}
set
{
ViewState["CanBeNull"] = value;
SetValiateControls();
}
}
//是否进行 ' 号替换
[Bindable(true),Category("Appearance"),DefaultValue("")]
public bool IsReplaceInvertedComma
{
get
{
object o= ViewState["IsReplaceInvertedComma"];
if(o==null||o.ToString().Trim()=="")
{
return true;
}
else
{
return o.ToString().ToLower()=="true"?true:false;
}
}
set
{
ViewState["IsReplaceInvertedComma"] = value;
}
}
[Bindable(true),Category("Appearance"),DefaultValue("")]
public string ValidationExpression
{
get
{
object o= ViewState["ValidationExpression"];
if(o==null||o.ToString().Trim()=="")
{
return null;
}
else
{
return o.ToString().ToLower();
}
}
set
{
ViewState["ValidationExpression"] = value;
}
}
[Bindable(true),Category("Appearance"),DefaultValue("")]
public string Text
{
get
{
if(this.RequiredFieldType == "日期")
{
try
{
return DateTime.Parse(tb.Text).ToString("yyyy-MM-dd");
}
catch
{
return "1900-1-1";
}
}
if(this.RequiredFieldType == "日期时间")
{
try
{
return DateTime.Parse(tb.Text).ToString("yyyy-MM-dd HH:mm:ss");
}
catch
{
return "1900-1-1 00:00:00";
}
}
else
{
return IsReplaceInvertedComma?tb.Text.Replace("'","''").Trim():tb.Text;
}
}
set
{
if(this.RequiredFieldType.IndexOf("日期")>=0)
{
try
{
tb.Text = DateTime.Parse(value).ToString("yyyy-MM-dd");
}
catch
{
tb.Text = "";
}
}
if(this.RequiredFieldType.IndexOf("日期时间")>=0)
{
try
{
tb.Text = DateTime.Parse(value).ToString("yyyy-MM-dd HH:mm:ss");
}
catch
{
tb.Text = "";
}
}
else
{
tb.Text=value;
}
}
}
//调控件的高度属性
[Bindable(false),Category("Appearance"),DefaultValue("")]
override public Unit Height
{
get
{
return tb.Height;
}
set
{
tb.Height = value;
}
}
//调控件的宽度属性
[Bindable(true),Category("Appearance"),DefaultValue("")]
override public Unit Width
{
get
{
return tb.Width;
}
set
{
tb.Width = value;
}
}
private int _rows=5;
//调控件的宽度属性
[Bindable(true),Category("Appearance"),DefaultValue(1)]
public int Rows
{
get
{
return _rows;
}
set
{
_rows = value;
}
}
private int _cols=45;
//调控件的宽度属性
[Bindable(true),Category("Appearance"),DefaultValue(30)]
public int Cols
{
get
{
return _cols;
}
set
{
_cols = value;
}
}
private int _size=45;
//调控件的宽度属性
[Bindable(true),Category("Appearance"),DefaultValue(30)]
public int Size
{
get
{
return _size;
}
set
{
_size = value;
}
}
//调控件的宽度属性
[Bindable(true),Category("Appearance"),DefaultValue(true)]
public override bool Enabled
{
get
{
return tb.Enabled;
}
set
{
tb.Enabled = value;
}
}
private string _maximumValue = null;
[Bindable(true),Category("Appearance"),DefaultValue(null)]
public string MaximumValue
{
get
{
return _maximumValue;
}
set
{
_maximumValue = value;
}
}
private string _minimumValue = null;
[Bindable(true),Category("Appearance"),DefaultValue(null)]
public string MinimumValue
{
get
{
return _minimumValue;
}
set
{
_minimumValue = value;
}
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
//output.Write(Text);
if(this.TextMode=="MultiLine")
{
output.WriteLine("<script type=\"text/javascript\">");
output.WriteLine("function isMaxLen(o){");
output.WriteLine("var nMaxLen=o.getAttribute? parseInt(o.getAttribute(\"maxlength\")):\"\";");
output.WriteLine(" if(o.getAttribute && o.value.length>nMaxLen){");
output.WriteLine(" o.value=o.value.substring(0,nMaxLen)");
output.WriteLine("}}</script>");
this.AddAttributes("rows",Rows.ToString());
this.AddAttributes("cols",Cols.ToString());
}
else
{
if(this.Width.Value.ToString()!="")
{
if(Width.Type.ToString()!="")
{
this.AddAttributes("SIZE",(Width.Value/10).ToString()+(Width.Type.ToString()=="Pixel"?"px":"%"));
}
else
{
this.AddAttributes("SIZE",(Width.Value/10).ToString()+"px");
}
}
if(this.Size.ToString()!="")
{
this.AddAttributes("SIZE",this.Size.ToString());
}
}
//当指定了输入框的最小或最大值时,则加入校验范围项
if(this.MaximumValue!=null||this.MinimumValue!=null)
{
rangevalidator.ControlToValidate=tb.ID;
rangevalidator.Type=ValidationDataType.Double;
rangevalidator.ForeColor=System.Drawing.Color.Black;
if(this.MaximumValue!=null&&this.MinimumValue!=null)
{
rangevalidator.MaximumValue=this.MaximumValue;
rangevalidator.MinimumValue=this.MinimumValue;
rangevalidator.ErrorMessage=" 当前输入数据应在"+this.MinimumValue+"和"+this.MaximumValue+"之间!";
}
else
{
if(this.MaximumValue!=null)
{
rangevalidator.MaximumValue=this.MaximumValue;
rangevalidator.ErrorMessage=" 当前输入数据允许最大值为"+this.MaximumValue;
}
if(this.MinimumValue!=null)
{
rangevalidator.MinimumValue=this.MinimumValue;
rangevalidator.ErrorMessage=" 当前输入数据允许最小值为"+this.MinimumValue;
}
}
rangevalidator.Display=ValidatorDisplay.Static;
this.Controls.Add(rangevalidator);
}
RenderChildren(output);
}
IPostBackDataHandler 成员
}
public class RequiredFieldTypeControlsConverter:StringConverter
{
public RequiredFieldTypeControlsConverter() {}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
ArrayList controlsArray = new ArrayList();
controlsArray.Add("暂无校验");
controlsArray.Add("数据校验");
controlsArray.Add("电子邮箱");
controlsArray.Add("移动手机");
controlsArray.Add("家用电话");
controlsArray.Add("身份证号码");
controlsArray.Add("网页地址");
controlsArray.Add("日期");
controlsArray.Add("日期时间");
controlsArray.Add("金额");
controlsArray.Add("IP地址");
controlsArray.Add("IP地址带端口");
return new StandardValuesCollection(controlsArray);
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
}
public class CanBeNullControlsConverter:StringConverter
{
public CanBeNullControlsConverter() {}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
ArrayList controlsArray = new ArrayList();
controlsArray.Add("可为空");
controlsArray.Add("必填");
return new StandardValuesCollection(controlsArray);
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
}
public class FormControlsConverter:StringConverter
{
public FormControlsConverter()
{
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
ControlCollection Controls = ((Page)context.Container.Components[0]).Controls;
ArrayList controlsArray = new ArrayList();
for(int i = 0 ;i < Controls.Count ; i++)
{
if((Controls[i] is HtmlTable
|| Controls[i] is HtmlForm
|| Controls[i] is HtmlGenericControl
|| Controls[i] is HtmlImage
|| Controls[i] is Label
|| Controls[i] is DataGrid
|| Controls[i] is DataList
|| Controls[i] is Table
|| Controls[i] is Repeater
|| Controls[i] is Image
|| Controls[i] is Panel
|| Controls[i] is PlaceHolder
|| Controls[i] is Calendar
|| Controls[i] is AdRotator
|| Controls[i] is Xml
))
{
controlsArray.Add(Controls[i].ClientID);
}
}
return new StandardValuesCollection(controlsArray);
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
}
public class TextModeFieldTypeControlsConverter:StringConverter
{
public TextModeFieldTypeControlsConverter()
{
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
ArrayList controlsArray = new ArrayList();
controlsArray.Add("Password");
controlsArray.Add("SingleLine");
controlsArray.Add("MultiLine");
return new StandardValuesCollection(controlsArray);
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return false;
}
}
}
本文标签:
很赞哦! ()
相关教程
图文教程
Discuz开发function_core常用函数分析
* [Discuz!] (C)2001-2099 Comsenz Inc.* This is NOT a freeware, use is subject to license terms
Discuz密码加密方式是怎么样的?
一般我们的加密都是采用md5加密方式:md5(变量)。但是昨天需要整合discuz的论坛,看他的加密方式也像是md5,但是简单的123加密后竟然解密不出来。
Discuz数据结构说明文档
由于工作需要,发现Discuz的数据结构在网上很难找到全的。希望找到的这个能对大家有帮助!discuz数据表结构
Discuz论坛关闭了吗?Discuz论坛重新恢复运营
最近,discuz创始人吴洪声(奶罩)对外宣布discuz在经历几个月的停止运营之后,discuz论坛再次回归开始恢复正常运营!
相关源码
-
(自适应)html5导航目录索引工具类网站源码下载本模板基于PbootCMS开发,为站长导航、网址导航类网站设计。采用HTML5+CSS3技术构建,适配PC端和移动端,提供流畅的浏览体验。适用于个人站长、资源导航平台等场景查看源码 -
(PC+WAP)蓝色低碳环保隔断板装修装饰类网站pbootcms源码下载本款基于PbootCMS开发的网站模板为活动隔断板、装修装饰行业打造,特别适合移动隔断、环保隔断、办公分区等产品的展示与推广。查看源码 -
(自适应)绿色农业大型机械设备展示网站模板下载基于PbootCMS内核深度定制开发的农业机械行业专用模板。针对农机设备展示、产品参数说明等需求优化设计,突出农业机械行业特性查看源码 -
WordPress主题模板JustNews资讯博客类源码V5.2.2JustNews主题针对博客创作、自媒体运营及资讯发布类网站的需求而设计,提供专业的内容展示与管理方案。该主题集成前端用户中心功能,支持用户在前端界面发布和投稿文章,操作流程简洁高效。查看源码 -
(响应式)WordPress主题Ripro9.0博客免扩展二开版RiPro9.0是基于RiPro8.9版本深度二开优化的资源付费主题,源码修正,修复原版多处功能异常,确保系统稳定运行。支持虚拟主机环境部署,无需特殊服务器配置。查看源码 -
(自适应响应式)高新技术科技能源pbootcms网站HTML5模板本模板基于PbootCMS内核开发,为高新技术、科技研发、能源技术等科技型企业设计。采用HTML5+CSS3前沿技术,具备完善的响应式布局,能够自动适配手机、平板和电脑等多种终端设备。模板设计风格简约大气查看源码
| 分享笔记 (共有 篇笔记) |
