解决Textbox的多行模式不能限制最大长度的bug [转]

以前解决.net的多行模式最大长度问题大多都是通过页面js脚本来实现,也许还有人通过服务端来验证,自己在网上搜了一把也未发现解决这个问题的简单方法。
  
   不知道MS是有意放过这个bug,还是我领会微软设计Textbox多行模式时的用意,在VS2005,乃至最近的VS2008beta都不见有改善过,还有就是webForm的Textbox多行模式设置最大长度无效,而windowform的却可以,也不知如此设计是何用意。
  
   其实网上的做法,也可以,只是我比较懒,想一劳永逸,所以自己通过结合js代码和自定义控件解决这个问题;这样就不必在每个有需要的页面都写一遍那个js脚本,只要让自定义控件根据需要自动调用就可以了。

   好了,言归正传,具体代码如下:
  
   js脚本部分:
  
   新建一个名为TextArea的js文件;在里面键入如下代码:
   
function doKeydown(control)
{
    var maxLength = control.attributes["maxLength"].value;
    var value = control.value;
    maxLength = parseInt(maxLength);
   
    if(maxLength && value.length > maxLength-1)
    {   
       if(event.keyCode!=8)//禁用除退格键外的所有键
       {
          οnfοcus=control.blur();
          event.returnValue = false; 
       }   
    }
}

//通过doKeyup事件解决doKeydown事件不能控制中文输入的长度的问题
function doKeyup(control)
{
   var maxLength = control.attributes["maxLength"].value;
   var value = control.value;
   maxLength = parseInt(maxLength); 
  
   if(maxLength && value.length > maxLength-1)
   {   
      value=value.substr(0,maxLength);
      control.value=value;
      οnfοcus=control.blur();//超长时取消焦点 禁止输入
   }     
}

//若剪贴板的内容超过指定长度,则取消复制
function doBeforePaste(control)
{
    var maxLength = control.attributes["maxLength"].value;
     
    if(maxLength)
    {
        event.returnValue = false;
    }
}

//复制时,截取限定长度的文本内容
function doPaste(control)
{
    var maxLength = control.attributes["maxLength"].value;
    var value = control.value;
   
    if(maxLength)
    {
          event.returnValue = false;
          maxLength = parseInt(maxLength);
          var area = control.document.selection.createRange();
          var iInsertLength = maxLength - value.length + area.text.length;
          var content= window.clipboardData.getData("Text").substr(0,iInsertLength);
          oTR.text = content;
     }
}


   自定义文本控件部分:
  
   添加一个名为TextArea的自定义控件,该类继承Textbox;并做如下修改:
  
   public class TextArea : TextBox
    {
        /// <summary>
        /// 通过重写PreRender加入自定义js脚本
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPreRender(EventArgs e)
        {
            if (MaxLength > 0 && TextMode == TextBoxMode.MultiLine)
            {
                //通过添加js脚本事件处理文本框的复制和输入
                Attributes.Add("onkeyup", "doKeyup(this);");
                Attributes.Add("onkeydown", "doKeydown(this);");
                Attributes.Add("onbeforepaste", "doBeforePaste(this);");
                Attributes.Add("onpaste", "doPaste(this);");

                // Add attribute for access of maxlength property on client-side
                Attributes.Add("maxLength", this.MaxLength.ToString());
                this.ToolTip = "最多只能输入" + MaxLength.ToString() + "字";// 提醒用户输入长度有限制

                //向客户端注册该脚本
                if (!Page.ClientScript.IsClientScriptIncludeRegistered("TextArea"))
                {
                    Page.ClientScript.RegisterClientScriptInclude("TextArea", ResolveClientUrl                    ("~/js/TextArea.js"));
                }
            }
            base.OnPreRender(e);
        }
    }

转载于:https://www.cnblogs.com/guodapeng/archive/2007/11/20/965015.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值