Discuz!NT控件剖析 之 TextBox [原创: 附源码]

时间:2021-03-28 17:10:52

         继上篇文章之后(http://www.cnblogs.com/daizhj/archive/2007/08/02/840607.html),大家给了不少的反馈,其中有肯定也有否定的,必
定程序设计有很多个性化的东西,因此就会有不同的意见产生。我会从中找出合理化的意见并纠正以往认识和设计思路上的错误。希望大
家能一如既往的支持我们的这个开源项目。

        好了,开始今天的话题,今天就说一下 TextBox 控件。
   
        先贴一张运行效果图让大家看一下:

      Discuz!NT控件剖析 之 TextBox [原创: 附源码]

         开发动机:早在上一家公司时,就有了这个控件的开发想法并设计了一个简单的“原型”。在加
入Discuz之后,因为要在后台管理设计用使用客户端JS校验,因此就在原有的代码基本上进行了相应
的扩充,添加了如正规订制,最大长度限制等功能。当前的这个代码是1.0版本中的源码。
         其实看过我们这个代码的人应该很容易看出这个控件是采用控件复合方式完成的。里面的几个控
件定义如下:

System.Web.UI.WebControls.TextBox tb=new System.Web.UI.WebControls.TextBox(); 
System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1=new RequiredFieldValidator();
System.Web.UI.WebControls.RegularExpressionValidator RegularExpressionValidator1=new RegularExpressionValidator();
System.Web.UI.WebControls.RangeValidator rangevalidator=new System.Web.UI.WebControls.RangeValidator();


         其中的tb就是这个控件的主角,客户端所呈现的文件框就是它, RequiredFieldValidator1用户
是否强制输入内容的控件(与tb进行绑定),而RegularExpressionValidator1则是将系统正则式或
用户定制的正则式进行初始化并与tb进行绑定和控制的控件。rangevalidator则是进行范围限制的控件。

         它们绑定的函数就是SetValiateControls(),现说明如下:

 1 Discuz!NT控件剖析 之 TextBox [原创: 附源码]SetValiateControls()
 2 Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] {
 3Discuz!NT控件剖析 之 TextBox [原创: 附源码]     
 4Discuz!NT控件剖析 之 TextBox [原创: 附源码]    this.Controls.Add(tb);  向自定控件中加入tb(TextBox)控件
 5Discuz!NT控件剖析 之 TextBox [原创: 附源码]        
 6Discuz!NT控件剖析 之 TextBox [原创: 附源码]    //当有要进行正则校验的设置时
 7Discuz!NT控件剖析 之 TextBox [原创: 附源码] if((RequiredFieldType!=null)&&(RequiredFieldType!="")&&(RequiredFieldType!="暂无校验"))
 8Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] {
 9Discuz!NT控件剖析 之 TextBox [原创: 附源码]        //设置显示信息方式为 "Dynamic"
10Discuz!NT控件剖析 之 TextBox [原创: 附源码]  RegularExpressionValidator1.Display=System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
11Discuz!NT控件剖析 之 TextBox [原创: 附源码]  //将textbox与RegularExpressionValidator1校验控件相绑定
12Discuz!NT控件剖析 之 TextBox [原创: 附源码]  RegularExpressionValidator1.ControlToValidate=tb.ID;
13Discuz!NT控件剖析 之 TextBox [原创: 附源码]  //根据校验类型加载相应的正则式
14Discuz!NT控件剖析 之 TextBox [原创: 附源码]  switch (RequiredFieldType)
15Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
16Discuz!NT控件剖析 之 TextBox [原创: 附源码]   case "数据校验":
17Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]   {
18Discuz!NT控件剖析 之 TextBox [原创: 附源码]       //如有用户定制的正则式则使用,如没有则使用系统自带的正则式
19Discuz!NT控件剖析 之 TextBox [原创: 附源码]       RegularExpressionValidator1.ValidationExpression=(this.ValidationExpression!=null)?
20Discuz!NT控件剖析 之 TextBox [原创: 附源码]       this.ValidationExpression:"^[-]?\\d+[.]?\\d*$";
21Discuz!NT控件剖析 之 TextBox [原创: 附源码]       //绑定错误信息
22Discuz!NT控件剖析 之 TextBox [原创: 附源码]       RegularExpressionValidator1.ErrorMessage="数字的格式不正确";break
23Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }

24Discuz!NT控件剖析 之 TextBox [原创: 附源码]   Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]
25Discuz!NT控件剖析 之 TextBox [原创: 附源码]  
26Discuz!NT控件剖析 之 TextBox [原创: 附源码]  //是否可以不输入内容的判断
27Discuz!NT控件剖析 之 TextBox [原创: 附源码]  switch (CanBeNull)
28Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
29Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]   case "可为空"break;  }
30Discuz!NT控件剖析 之 TextBox [原创: 附源码]   case "必填":
31Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]   {
32Discuz!NT控件剖析 之 TextBox [原创: 附源码]       //当必填时则进行RequiredFieldValidator1的设置和tb的绑定
33Discuz!NT控件剖析 之 TextBox [原创: 附源码]       RequiredFieldValidator1.Display=System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
34Discuz!NT控件剖析 之 TextBox [原创: 附源码]       RequiredFieldValidator1.ControlToValidate=tb.ID;
35Discuz!NT控件剖析 之 TextBox [原创: 附源码]       RequiredFieldValidator1.ErrorMessage="<font color=red>请务必输入内容!</font>";
36Discuz!NT控件剖析 之 TextBox [原创: 附源码]       this.Controls.Add(RequiredFieldValidator1);
37Discuz!NT控件剖析 之 TextBox [原创: 附源码]       break
38Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }

39Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]   default : break;  }
40Discuz!NT控件剖析 之 TextBox [原创: 附源码]  }

41Discuz!NT控件剖析 之 TextBox [原创: 附源码]  Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]
42Discuz!NT控件剖析 之 TextBox [原创: 附源码]    }

43Discuz!NT控件剖析 之 TextBox [原创: 附源码]    
44Discuz!NT控件剖析 之 TextBox [原创: 附源码]

    
         下面依次说明其它主要属性和功能:
    
    

  1 Discuz!NT控件剖析 之 TextBox [原创: 附源码]SetFocusButtonID属性用户当用户在tb控件中输入回车符时相应获得焦点的控件ID(一般是“提交”按钮的ID值),
  2 Discuz!NT控件剖析 之 TextBox [原创: 附源码]相关代码如下:
  3 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    [Bindable( true ),Category( " Appearance " ),DefaultValue( "" )] 
  4 Discuz!NT控件剖析 之 TextBox [原创: 附源码]  public   string  SetFocusButtonID
  5 Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
  6Discuz!NT控件剖析 之 TextBox [原创: 附源码]     get
  7Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]     {
  8Discuz!NT控件剖析 之 TextBox [原创: 附源码]   object o = ViewState[this.ClientID+"_SetFocusButtonID"];
  9Discuz!NT控件剖析 之 TextBox [原创: 附源码]   return (o==null)?"":o.ToString(); 
 10Discuz!NT控件剖析 之 TextBox [原创: 附源码]     }

 11Discuz!NT控件剖析 之 TextBox [原创: 附源码]  set
 12Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
 13Discuz!NT控件剖析 之 TextBox [原创: 附源码]   ViewState[this.ClientID+"_SetFocusButtonID"= value;
 14Discuz!NT控件剖析 之 TextBox [原创: 附源码]   if(value!="")
 15Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]   {
 16Discuz!NT控件剖析 之 TextBox [原创: 附源码]    tb.Attributes.Add("onkeydown","if(event.keyCode==13){
 17Discuz!NT控件剖析 之 TextBox [原创: 附源码]     document.getElementById('"+value+"').focus();}
");
 18Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }

 19Discuz!NT控件剖析 之 TextBox [原创: 附源码]  }

 20 Discuz!NT控件剖析 之 TextBox [原创: 附源码] }   
 21 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 22 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 23 Discuz!NT控件剖析 之 TextBox [原创: 附源码]     // 为tb控件设置内容最大长度属性,注当为多行“MultiLink”(即:textarea)时,会使用JS得到获取该属性进行长度的检查
 24 Discuz!NT控件剖析 之 TextBox [原创: 附源码]     [Bindable( true ),Category( " Appearance " ),DefaultValue( "" )] 
 25 Discuz!NT控件剖析 之 TextBox [原创: 附源码]     public   int  MaxLength
 26 Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]     {   
 27Discuz!NT控件剖析 之 TextBox [原创: 附源码] get 
 28Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 29Discuz!NT控件剖析 之 TextBox [原创: 附源码]  object o =ViewState["TextBox_MaxLength"]; 
 30Discuz!NT控件剖析 之 TextBox [原创: 附源码]  if(o!=null)
 31Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
 32Discuz!NT控件剖析 之 TextBox [原创: 附源码]   int maxlength= Convert.ToInt32(o.ToString()); 
 33Discuz!NT控件剖析 之 TextBox [原创: 附源码]   AddAttributes("maxlength",maxlength.ToString());
 34Discuz!NT控件剖析 之 TextBox [原创: 附源码]   return  maxlength;
 35Discuz!NT控件剖析 之 TextBox [原创: 附源码]  }

 36Discuz!NT控件剖析 之 TextBox [原创: 附源码]  else
 37Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
 38Discuz!NT控件剖析 之 TextBox [原创: 附源码]   return -1;
 39Discuz!NT控件剖析 之 TextBox [原创: 附源码]  }

 40Discuz!NT控件剖析 之 TextBox [原创: 附源码] }
 
 41Discuz!NT控件剖析 之 TextBox [原创: 附源码] set 
 42Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 43Discuz!NT控件剖析 之 TextBox [原创: 附源码]  ViewState["TextBox_MaxLength"= value; 
 44Discuz!NT控件剖析 之 TextBox [原创: 附源码]  AddAttributes("maxlength",value.ToString());
 45Discuz!NT控件剖析 之 TextBox [原创: 附源码] }
 
 46Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }

 47 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 48 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 49 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    // 控件的TextMode属性,用于定制显示模式为“密码,单行或多行”
 50 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    [Bindable( false ),Category( " Behavior " ),DefaultValue( "" ),TypeConverter(
 51 Discuz!NT控件剖析 之 TextBox [原创: 附源码]   typeof (TextModeFieldTypeControlsConverter)),Description( " 要滚动的对象。 " )] 
 52 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    public   string  TextMode  
 53 Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]   
 54Discuz!NT控件剖析 之 TextBox [原创: 附源码] get
 55Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] {
 56Discuz!NT控件剖析 之 TextBox [原创: 附源码]  return tb.TextMode.ToString();
 57Discuz!NT控件剖析 之 TextBox [原创: 附源码] }

 58Discuz!NT控件剖析 之 TextBox [原创: 附源码] set
 59Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] {
 60Discuz!NT控件剖析 之 TextBox [原创: 附源码]  if (value=="Password")     tb.TextMode =TextBoxMode.Password;
 61Discuz!NT控件剖析 之 TextBox [原创: 附源码]  if (value=="MultiLine"
 62Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]  {
 63Discuz!NT控件剖析 之 TextBox [原创: 附源码]   tb.TextMode =TextBoxMode.MultiLine;
 64Discuz!NT控件剖析 之 TextBox [原创: 附源码]   tb.Attributes.Add("onkeyup","return isMaxLen(this)");
 65Discuz!NT控件剖析 之 TextBox [原创: 附源码]  }

 66Discuz!NT控件剖析 之 TextBox [原创: 附源码]  if (value=="SingleLine")   tb.TextMode =TextBoxMode.SingleLine;
 67Discuz!NT控件剖析 之 TextBox [原创: 附源码] }

 68Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }

 69 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 70 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    // 设置校验类型, 并初始化控件绑定
 71 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    [Bindable( false ),Category( " Behavior " ),DefaultValue( "" ),TypeConverter( typeof (
 72 Discuz!NT控件剖析 之 TextBox [原创: 附源码]   RequiredFieldTypeControlsConverter)),Description( " 要滚动的对象。 " )] 
 73 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    public   string  RequiredFieldType   // 要进行校验的表达式
 74 Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]    
 75Discuz!NT控件剖析 之 TextBox [原创: 附源码] get 
 76Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 77Discuz!NT控件剖析 之 TextBox [原创: 附源码]  object o =  ViewState["RequiredFieldType"]; 
 78Discuz!NT控件剖析 之 TextBox [原创: 附源码]    return (o==null)?"":o.ToString(); 
 79Discuz!NT控件剖析 之 TextBox [原创: 附源码] }
 
 80Discuz!NT控件剖析 之 TextBox [原创: 附源码] set 
 81Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 82Discuz!NT控件剖析 之 TextBox [原创: 附源码]  ViewState["RequiredFieldType"= value; 
 83Discuz!NT控件剖析 之 TextBox [原创: 附源码]  //初始化控件绑定,此处代码调用先后逻辑还存在一些问题,已在2.0版本做相应修正。
 84Discuz!NT控件剖析 之 TextBox [原创: 附源码]  SetValiateControls(); 
 85Discuz!NT控件剖析 之 TextBox [原创: 附源码] }
 
 86Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }
 
 87 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 88 Discuz!NT控件剖析 之 TextBox [原创: 附源码]   Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码].
 89 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 90 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 91 Discuz!NT控件剖析 之 TextBox [原创: 附源码]    // 采用下拉框显示方式来显示校验类型,如图:
 92 Discuz!NT控件剖析 之 TextBox [原创: 附源码]     public   class  RequiredFieldTypeControlsConverter:StringConverter
 93 Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]    {
 94Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] public RequiredFieldTypeControlsConverter() {}
 95Discuz!NT控件剖析 之 TextBox [原创: 附源码]
 96Discuz!NT控件剖析 之 TextBox [原创: 附源码] public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
 97Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
 98Discuz!NT控件剖析 之 TextBox [原创: 附源码]  return true
 99Discuz!NT控件剖析 之 TextBox [原创: 附源码] }
 
100Discuz!NT控件剖析 之 TextBox [原创: 附源码]
101Discuz!NT控件剖析 之 TextBox [原创: 附源码] public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(
102Discuz!NT控件剖析 之 TextBox [原创: 附源码]   ITypeDescriptorContext context) 
103Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
104Discuz!NT控件剖析 之 TextBox [原创: 附源码]  ArrayList controlsArray = new ArrayList(); 
105Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("暂无校验"); 
106Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("数据校验");
107Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("电子邮箱");
108Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("移动手机"); 
109Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("家用电话"); 
110Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("身份证号码"); 
111Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("网页地址"); 
112Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("日期"); 
113Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("日期时间"); 
114Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("金额"); 
115Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("IP地址"); 
116Discuz!NT控件剖析 之 TextBox [原创: 附源码]  controlsArray.Add("IP地址带端口"); 
117Discuz!NT控件剖析 之 TextBox [原创: 附源码]  return new StandardValuesCollection(controlsArray); 
118Discuz!NT控件剖析 之 TextBox [原创: 附源码]       }
 
119Discuz!NT控件剖析 之 TextBox [原创: 附源码]  
120Discuz!NT控件剖析 之 TextBox [原创: 附源码] public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
121Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
122Discuz!NT控件剖析 之 TextBox [原创: 附源码]  return false
123Discuz!NT控件剖析 之 TextBox [原创: 附源码] }
 
124Discuz!NT控件剖析 之 TextBox [原创: 附源码]   }

125 Discuz!NT控件剖析 之 TextBox [原创: 附源码]   Discuz!NT控件剖析 之 TextBox [原创: 附源码]Discuz!NT控件剖析 之 TextBox [原创: 附源码]
126 Discuz!NT控件剖析 之 TextBox [原创: 附源码] 
127 Discuz!NT控件剖析 之 TextBox [原创: 附源码]
128 Discuz!NT控件剖析 之 TextBox [原创: 附源码]

        上图:        
       Discuz!NT控件剖析 之 TextBox [原创: 附源码]

         这样就完成了这个控件的主*分,而其它的一些属性,如MaximumValue(最大值),MinimumValue(最小值)仅在进行数据
校验时有效。而Text属性中的日期格式强制转换主要为了避免不同语言操作系统,数据库日期格式不同才这样操作的。
 
 
         存在的问题:firefox 下的校验js无法使用。
         程序逻辑结构还有待优化。
         选项中出现中文,数据校验,电子邮箱等(以后会采用英文)

         如果ie下 js 无法使用可运行“开始” - “运行” -- 输入“cmd” 然后执行
        C:/windows/Microsoft.Net/Framework/v1.1.4322/aspnet_regiis -c  即可

        下载地址:/Files/daizhj/TextBox_ControlsTest.rar