不知道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);
}
}