件代码如下:
<asp:TextBox id="TextBox1" runat="server" TextMode=MultiLine Height="96px" Width="131px" MaxLength=66></asp:TextBox>
运行后无法控制输入内容长度,可以无限制输入。原因何在???望指教
MaxLength对单行文本框有效 多行就不行了
似乎现在也没有完美的解决方法 涉及的文本编码的很多方面 例如中,英文,数字 不是输入而是粘贴等等.
较可行的方法: 加入CustomValidator验证控件然后自己写脚本
转听棠blog 对这个问题的探讨:
第一.
<script language="javascript">
<!--
String.prototype.len=function(){
return this.replace(/[^\x00-\xff]/g,"**").length;
}
function CheckLength(source, arguments)
{
var ValidStrLength=50;
if (arguments.Value.len()<=ValidStrLength)
arguments.IsValid = true;
else
arguments.IsValid = false;
}
//-->
</script>
在界面上使用上面的脚本,然后在需要验证的地方,加上CustomValidator验证控件,把ClientValidationFunction属性指定为"CheckLength",这个方法就是上面的客户端函数,函数中的 var ValidStrLength=50; 就是指要验证的字符数。要说明的是,这里的字符数是会自动区分中文字符的,一个中文字符会自动记为两个字符,因此,不需要象单行文本框一样,设置为总字符数的一半来控制。
好了,通过上面的设置,你就可以看到被控制的效果了!!
第二.
第一有个地方感觉不大好,就是这样用customer validator来控制就和一般textbox设置maxlength所得到的效果不是很一致.一种是限制输入一种是提示错误.
我是用的javascript来控制的.
//Set maxlength for multiline TextBox
function setMaxLength(object,length)
{
var result = true;
var controlid = document.selection.createRange().parentElement().id;
var controlValue = document.selection.createRange().text;
if (controlid == object.id && controlValue != "")
{
result = true;
}
else if (object.value.length >= length)
{
result = false;
}
if (window.event)
{
window.event.returnValue = result;
return result;
}
}
//Check maxlength for multiline TextBox when paste
function limitPaste(object,length)
{
var tempLength = 0;
if(document.selection)
{
if(document.selection.createRange().parentElement().id == object.id)
{
tempLength = document.selection.createRange().text.length;
}
}
var tempValue = window.clipboardData.getData("Text");
tempLength = object.value.length + tempValue.length - tempLength;
if (tempLength > length)
{
tempLength -= length;
tempValue = tempValue.substr(0,tempValue.length - tempLength);
window.clipboardData.setData("Text", tempValue);
}
window.event.returnValue = true;
}
然后设多行的textbox的2个属性.
onkeypress="javascript:setMaxLength(this,100);" onpaste="limitPaste(this, 100)"
第三.
第二的方案很不错,但也一个问题,就是没有区分中英文字符,中文字符应该算作是两个字符,为此我进行了扩展:
<script language=javascript>
<!--
String.prototype.len=function(){
return this.replace(/[^\x00-\xff]/g,"**").length;
}
//Set maxlength for multiline TextBox
function setMaxLength(object,length)
{
var result = true;
var controlid = document.selection.createRange().parentElement().id;
var controlValue = document.selection.createRange().text;
if (controlid == object.id && controlValue != "")
{
result = true;
}
else if (object.value.len() >= length)
{
result = false;
}
if (window.event)
{
window.event.returnValue = result;
return result;
}
}
//Check maxlength for multiline TextBox when paste
function limitPaste(object,length)
{
var tempLength = 0;
if(document.selection)
{
if(document.selection.createRange().parentElement().id == object.id)
{
tempLength = document.selection.createRange().text.len();
}
}
var tempValue = window.clipboardData.getData("Text");
tempLength = object.value.len() + tempValue.len() - tempLength;
if (tempLength > length)
{
tempLength -= length;
alert(tempLength);
alert(tempValue);
var tt="";
for(var i=0;i<tempValue.len()-tempLength;i++)
{
if(tt.len()<(tempValue.len()-tempLength))
tt=tempValue.substr(0,i+1);
else
break;
}
tempValue=tt;
window.clipboardData.setData("Text", tempValue);
}
window.event.returnValue = true;
}
//-->
</script>
然后设多行的textbox的2个属性.
onkeypress="javascript:setMaxLength(this,100);" onpaste="limitPaste(this, 100)"
现在好了,可以自动区分中英文了,这个方案不错