天天看点

解决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