以前解決.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