Irongeek 检查动态生成的多行文本框真代码是否溢出
我的问题是textbox的Rows属性始终为0,可能是因为代码不知道textbox将呈现多少行。所以我显示3行,溢出被隐藏,我想要添加按钮来打开全文。但只有当文本框中的行数超过3行时,按钮才会显示。那么,有没有什么方法可以在代码中检查这一点呢Irongeek 检查动态生成的多行文本框真代码是否溢出,irongeek,c#,asp.net,Irongeek,C#,Asp.net,我的问题是textbox的Rows属性始终为0,可能是因为代码不知道textbox将呈现多少行。所以我显示3行,溢出被隐藏,我想要添加按钮来打开全文。但只有当文本框中的行数超过3行时,按钮才会显示。那么,有没有什么方法可以在代码中检查这一点呢 TextBox text = new TextBox(); text.ID = "Poruka" + i; text.Text = podaci.GetString(2); text.TextMode = TextBoxMode.MultiLine; te
TextBox text = new TextBox();
text.ID = "Poruka" + i;
text.Text = podaci.GetString(2);
text.TextMode = TextBoxMode.MultiLine;
text.Width = Unit.Pixel(535);
text.Height = Unit.Pixel(45);
text.Enabled = false;
text.Style.Add("overflow", "hidden");
PanelSadrzaj.Controls.Add(text);
if (text.Text.Length > 198 || ????)
{
Button vise = new Button();
vise.ID = "Vise" + i;
vise.Text = "Prikaži cijelu poruku";
vise.Width = Unit.Pixel(200);
vise.CssClass = "ButtonDodaj";
vise.Font.Bold = true;
vise.OnClientClick = "PrikaziPoruku_Click";
PanelSadrzaj.Controls.Add(vise);
}
编辑:解决方案是添加此函数,并在ContentTemplate的UpdatePanel中调用它。
功能代码:
function CheckOverflow() {
$("textarea").each(function () {
var threshold = 2;
var sender = $(this);
var lineCount = sender.val().split("\n").length;
var overflow = sender[0].offsetHeight < sender[0].scrollHeight - threshold;
var id = $(this).attr('id');
id = id.slice(-1);
if (lineCount > 3 || overflow) {
$('#Buttonid' + id).show();
}
else {
$('#Buttonid' + id).hide();
}
alert(id);
});
}
函数CheckOverflow(){
$(“textarea”)。每个(函数(){
var阈值=2;
var sender=$(此值);
var lineCount=sender.val().split(“\n”).length;
var overflow=sender[0]。offsetHeight3 | |溢出){
$('#Buttonid'+id).show();
}
否则{
$('#Buttonid'+id).hide();
}
警报(id);
});
}
UpdatePanel代码:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<script type="text/javascript" language="javascript">
Sys.Application.add_load(CheckOverflow);
</script>
<ContentTemplate>
</asp:UpdatePanel>
我认为您无法做到这一点,因为rows属性所做的只是设置用户可见的行数
但是,我认为您可以不使用Width
属性,而使用Columns
属性。这样,您可以在每行中设置一定数量的字符(例如,25,三行为75个字符)
e、 g
由于您使用的是一个多行
文本框
,因此整个文本在一行中,并且仅为显示目的而拆分。为了找到实际行数,必须使用MeasureString
,如下所示:
using (Graphics g = CreateGraphics())
{
SizeF size = g.MeasureString(textBox1.Text, textBox1.Font);
int linesCount = (int)(size.Height / textBox1.Font.GetHeight());
}
从您的示例中,我假设这是关于Web应用程序中的多行文本框,也称为TextArea
。要实现您想要的,您需要编写一点javascript并将其放入文档中
基本上你需要:
监控文本区域中键入了多少行
检查是否有任何内容溢出
相应地显示/隐藏“更多”按钮
没有用于获取TextArea
中的行数的内置函数,但您可以通过计算换行字符数(\n
)来模拟该函数。至于检查内容溢出,您可以通过将元素的offsetHeight
属性与其scrollHeight
属性(假设没有水平溢出)进行比较来进行检查,例如:
$('#txtArea').on('input', function() {
var threshold = 2; // number of pixel to account for border and etc
var sender = $(this);
var lineCount = sender.val().split("\n").length;
var overflow = sender[0].offsetHeight < sender[0].scrollHeight - threshold;
if (lineCount > 3 || overflow) {
$('#btnMore').show();
}
else {
$('#btnMore').hide();
}
}
$('#txtArea')。在('input',function()上{
var threshold=2;//用于边框等的像素数
var sender=$(此值);
var lineCount=sender.val().split(“\n”).length;
var overflow=sender[0]。offsetHeight3 | |溢出){
$('#btnMore').show();
}
否则{
$('#btnMore').hide();
}
}
JSFIDLE演示:
更新:
更改JSFIDLE demo以匹配OP的示例:问题是,例如,如果用户键入50个字符和2个换行符,这段代码是否会识别出这一点。您需要添加逻辑来计算回车和换行符,即四行文本看起来像“Line1\r\nLine2\r\n换行符3\r\nLast line”。我还认为您需要小心使用固定宽度字体,否则会遇到问题。我已经用我建议的内容更新了示例代码,但没有在所有场景中对其进行测试。不,它不适用于所有场景,因为新行字符是由程序添加的,而文本框是呈现的。名称“CreateGraphics”不适用于所有场景在当前上下文中,参数2:无法从“System.Web.UI.WebControl.FontInfo”转换为“System.Drawing.Font”CreateGraphics
是Control
的成员。您可以以任何形式使用它,或使用textBox1.CreateGraphics()
。
$('#txtArea').on('input', function() {
var threshold = 2; // number of pixel to account for border and etc
var sender = $(this);
var lineCount = sender.val().split("\n").length;
var overflow = sender[0].offsetHeight < sender[0].scrollHeight - threshold;
if (lineCount > 3 || overflow) {
$('#btnMore').show();
}
else {
$('#btnMore').hide();
}
}