2013年5月24日 星期五

如何讓TextBox的MaxLength對中文字元的長度計算也起作用?

在TextBox元件中設定的MaxLength,測試結果是對字數的限制,但是對應到資料庫的欄位長度就不符合,若輸入中文(double bytes)可能常常造成Oracle吐錯誤訊息「ORA-01401: Inserted value too large for column」,提供參考方向: 自訂控制項。

1. 繼承原有的TextBox,並修改MaxLength的實作AddAttributesToRender

using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System;

namespace CONTROL
{
  [ToolboxData("<{0}:TxtCommon runat=\"server\"></{0}:TxtCommon>")]//指定當自訂控制項從工具箱拖曳出來時,為此自訂控制項產生的預設標記。
  public class TxtCommon : TextBox
  {
    protected override void OnInit(System.EventArgs e)
    {
      base.OnInit(e);

      // 開始註冊JS在頁面上, 如果已經註冊便跳過
      Type type = this.GetType();
      string strJsLoc = "";
      string key = "CONTROL.JavaScript.Utility.js";
      if (!Page.ClientScript.IsClientScriptIncludeRegistered(key))
      {
        strJsLoc = this.Page.ClientScript.GetWebResourceUrl(type, key);
        this.Page.ClientScript.RegisterClientScriptInclude(key, strJsLoc);
      }
    }
   
    /// <summary>
    /// 寫入控制項額外屬性
    /// </summary>
    /// <param name="writer"></param>

    protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
    {
      base.AddAttributesToRender(writer);
      string strOnBlur = "";
      
      if (this.MaxLength != 0)
      {
          strOnBlur += string.Format("ChkBLen(this,{0});", this.MaxLength.ToString());
      }

      if (strOnBlur != "")
      {
          writer.AddAttribute("onblur", strOnBlur);
      }
    }
  }
}


2. 在註冊的JS中實作ChkBLen:

 //檢核長度
function ChkBLen(obj,intMaxByte)
{
    obj.value=obj.value;
    if(obj.value.Blength()>intMaxByte)
    {
        alert("超過最大長度限制:"+intMaxByte);
        while(obj.value.Blength()>intMaxByte)
        {
            obj.value=obj.value.substr(0,obj.value.length-1)
        }
        obj.focus();
    }
  
}

//傳回字串的byte長度
String.prototype.Blength = function() {
    var arr = this.match(/[^\x00-\xff]/ig);
    return  arr == null ? this.length : this.length + arr.length;



如此一來,在新增 TxtCommon自訂控制項時,若設定MaxLength,則在onblur事件發生時,就會自動呼叫ChkBLen,自動截斷多於的長度。

沒有留言:

張貼留言