天天看點

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