鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 233, 评论 - 5420, 引用 - 344
数据加载中……

自动适应输入内容高度的TextBox控件

    关于Web开发上面UI布局的问题,我上次介绍了一个可以自动适应输入内容宽度的TextBox控件,它可以解决在布局时预留控件大小和用户数入内容多少上的矛盾。但是由于那个控件被限制了只能做为单行输入使用:(,在输入大块文本时就力不从心了,那么就再做一个可自动适应高度的TextBox。

    原理和那个适应宽度的TextBox查不多,只是这个反而更加简单,因为在高度方向上增长不会破坏页面的整体布局效果(宽度上的如果在页内会挤走别的元素的),所以就不需要使用Agent TextBox来作为实际录入的容器了,直接把<TextArea>增高就行了。

    响应onpropertychange事件,同步内容和<TextArea>的高度。当然如果完全根据内容增高可能也会因为内容太多而变得难看,就设置了一个最大高度限制属性。控件效果如下:

   
最大高度为200px的AutoTextBox Demo:
最大高度为200px但初始高度为3rows的AutoTextBox Demo:
高度增长无限制的AutoTextBox Demo:
    如果控件的MaxHeight属性小于或等于0,那么增长高度无限制。

附 AutoTextBox 控件源码

posted on 2004-12-29 00:49 birdshome 阅读(2602) 评论(14)  编辑 收藏 所属分类: Asp.net控件开发

评论

#1楼    回复  引用    

好像只有IE支持,其他Browser有问题。努力解决中。。。
http://dev365.yculblog.com/post-350482.html
2004-12-29 03:09 | 红移 [未注册用户]

#2楼    回复  引用  查看    

不错!很好!支持!
2004-12-29 10:22 | 吕震宇      

#3楼    回复  引用  查看    

此外,打印的时候也是有问题的比如不能换页,要是能解决就好了
2004-12-29 12:28 | 一切由.NET开始      

#4楼 [楼主]   回复  引用  查看    

@红移
目前没有使用IE以外浏览器的计划,不知道它们是否有onpropertycheage事件,如果没有就麻烦了

@一切由.NET开始
你要用<TextArea>来打印吗?好像真得没法简单换页哦
2004-12-29 15:00 | birdshome      

#5楼    回复  引用    

第二个demo有bug,一旦输入内容,就会变成1行高,预设高度没有起作用
2004-12-30 17:51 | Tm3 [未注册用户]

#6楼 [楼主]   回复  引用  查看    

bug已修复,源代码也已经更新。
2005-01-02 21:20 | birdshome      

#7楼    回复  引用    

自动适应输入内容高度的TextBox控件 有Bug,只要一直按住键盘上的英文字母输入的话,整个文本框就会越输越越长,不能控制。
2005-10-14 11:38 | lmlok [未注册用户]

#8楼    回复  引用    

如果自动适应从库中读出的数据,怎么做呢?
2006-06-24 11:52 | qq——qqq [未注册用户]

#9楼    回复  引用    

请问能够赋初值吗?还有加入C#里面的话,是否找不到这个控件了?如: <td align="left" bgcolor="#ffffff" colspan="1" style="height: 24px; width: 82px;" valign="top">
<textarea name="aa" id="aa" onpropertychange="this.style.height=((this.scrollHeight>40)?40:this.scrollHeight)+(this.offsetHeight-this.clientHeight+1)" rows="1" style="overflow-y: auto; width: 80px; border-top-style: groove; font-family: tahoma;border-right-style: groove; border-left-style: groove; height: 22px; border-bottom-style: groove"></textarea></td>
然后在C#页面引用aa会发现找不到控件,为什么了?
2007-09-02 15:59 | 郑治成 [未注册用户]

#10楼 [楼主]   回复  引用  查看    

@郑治成
你需要添加runat=server属性到<textarea>标签上,并且声明一个HtmlGeneralControl控件。
2007-09-02 18:24 | birdshome      

#11楼    回复  引用  查看    

直接赋值好像不行触发自动适应。要输入字符才会触发自动适应。
有没有办法一开始赋值就触发呢?
2007-12-12 09:32 | 鬼幻天使      

#12楼 [楼主]   回复  引用  查看    

@鬼幻天使
用脚本赋值应改可以触发吧?如果是在服务器端赋值就不行了。
2007-12-12 09:46 | birdshome      

#13楼    回复  引用  查看    

服务器端赋值,并调整高度,
已经有解决办法了。
解决方法如下:
在OnPreRender事件中,增加如下代码。

// 解决服务器端赋值后,不能自动调整高度。
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "__AutoTextAreaOnLoad"))
{
string strJs = @"window.attachEvent('onload',function()<document.getElementById('{0}').value = document.getElementById('{0}').value;>)";

strJs = string.Format(strJs, this.ClientID).Replace('<', '{').Replace('>', '}');
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "__AutoTextAreaOnLoad", strJs, true);
}
2008-03-19 19:48 | 老夫子系      

#14楼    回复  引用  查看    

为什么插入代码时报这个错误呀。
---------------------------
错误
---------------------------
出现了运行时间错误。
是否要进行调试?

行: 14
错误: 'window.opener' 为空或不是对象
---------------------------
是(Y)   否(N)  
---------------------------

2008-03-19 19:52 | 老夫子系      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-01-02 21:21 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: