C# 使文本框在';这是一条线的尽头
这似乎是一项容易的任务,然而,我找不到任何工作方法来完成它。我想要一个C# 使文本框在';这是一条线的尽头,c#,winforms,C#,Winforms,这似乎是一项容易的任务,然而,我找不到任何工作方法来完成它。我想要一个textbox当我们在一整行末尾键入时自动向其自身添加额外的行(因此,我们被重定向到一个新行)。 也许我可以用下面的方式更好地展示它: 文本框当前值:asdfghj(这是文本框的全长) 我们在j之后键入新字符串:asd。我明白了: asd 只有一行,要查看第一行,我需要向上滚动^ 我想看看: asdfghj asd 两行 我尝试了以下代码: private void textBox1_TextChanged(objec
textbox
当我们在一整行末尾键入时自动向其自身添加额外的行(因此,我们被重定向到一个新行)。
也许我可以用下面的方式更好地展示它:文本框当前值:
asdfghj
(这是文本框的全长)我们在
j
之后键入新字符串:asd
。我明白了:
asd
只有一行,要查看第一行,我需要向上滚动^
我想看看:
asdfghj
asd
两行
我尝试了以下代码:
private void textBox1_TextChanged(object sender, EventArgs e)
{
Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
textBox1.Width = size.Width;
textBox1.Height = size.Height;
}
但是当我只按
enter
或shift-enter
时,会创建额外的一行。我希望它能自动添加。我还有Multiline=true
和Wordwrap=true
如果设置了Multiline
,您可以这样做:
1) 通过将TextBox
中最后一行文本拆分为一个数组来估计其长度(可能不是最快的)
2) 如果该行具有更多的MAX_CHARS
CHARS,则
3) 获取除最后一个字符外的所有文本,然后添加新行和该字符
4) 正确的选择和位置
const int MAX_CHARS = 10;
private void textBox1_TextChanged(object sender, EventArgs e)
{
string[] sTextArray = textBox1.Text.Split( new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries );
int nLines = sTextArray.Length;
string sLastLine = sTextArray[nLines -1];
if (sLastLine.Length > MAX_CHARS)
{
int nTextLen = textBox1.Text.Length;
string sText = textBox1.Text.Substring(0, nTextLen - 1) + Environment.NewLine + textBox1.Text[nTextLen - 1];
textBox1.Text = sText;
textBox1.SelectedText = "";
textBox1.Select(nTextLen +2, 0);
}
}
有点像黑客,但是试试这个,看看它是否适合你的需要:
int previouslines = 1;
private void textBox2_TextChanged(object sender, EventArgs e)
{
int size=textBox2.Font.Height;
int lineas = textBox2.Lines.Length;
int newlines = 0;
if (textBox2.Text.Contains(Environment.NewLine))
{
newlines = textBox2.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None).Length - 1;
lineas += newlines - (textBox2.Lines.Length - 1);
}
for(int line_num= 0;line_num<textBox2.Lines.Length;line_num++)
{
if (textBox2.Lines[line_num].Length > 1)
{
int pos1=textBox2.GetFirstCharIndexFromLine(line_num);
int pos2= pos1 + textBox2.Lines[line_num].Length-1;
int y1 = textBox2.GetPositionFromCharIndex(pos1).Y;
int y2 = textBox2.GetPositionFromCharIndex(pos2).Y;
if (y1 != y2)
{
int aux = y2+size;
lineas = (aux / size);
if (y1 != 1)
{
lineas++;
}
lineas += newlines - (textBox2.Lines.Length - 1);
}
}
}
if (lineas > previouslines)
{
previouslines++;
textBox2.Height = textBox2.Height + size;
}
else if (lineas<previouslines)
{
previouslines--;
textBox2.Height = textBox2.Height - size;
}
}
int-previouslines=1;
私有void textBox2_TextChanged(对象发送方,事件参数e)
{
int size=textBox2.Font.Height;
int lineas=textBox2.Lines.Length;
int换行符=0;
if(textBox2.Text.Contains(Environment.NewLine))
{
newlines=textBox2.Text.Split(新字符串[]{Environment.NewLine},StringSplitOptions.None);
lineas+=换行符-(textBox2.Lines.Length-1);
}
对于(整数行数=0;行数1)
{
int pos1=textBox2.GetFirstCharIndexFromLine(line_num);
int pos2=pos1+textBox2.Lines[line_num].Length-1;
inty1=textBox2.GetPositionFromCharIndex(pos1.Y);
inty2=textBox2.GetPositionFromCharIndex(pos2.Y);
如果(y1!=y2)
{
int aux=y2+尺寸;
线性=(辅助/尺寸);
如果(y1!=1)
{
lineas++;
}
lineas+=换行符-(textBox2.Lines.Length-1);
}
}
}
如果(直线>先前的直线)
{
前几行++;
textBox2.高度=textBox2.高度+尺寸;
}
否则如果(line这类代码与我的代码结合使用。但它在第二行之后正确地添加了行。此外,我们可以返回并向以前的任何字符串添加更多字符,字符大小也不同,10xw
填充了行,但10xf
填充了行。总体上看起来不太好。以此为起点。而不是最大字符可以使用您的MeasureText或任何其他。如果用户返回,您可以对当前行进行检查。重点是分析该行并使用子字符串插入换行符。这很有效!只有一点,当我们键入一些文本时,我们会按照我的意愿添加行,但当我们清除文本框时,大小不会更改为一行。请尝试编辑答案,以便在清除文本时调整文本框一些错误:如果在第2行中连续键入第2个符号会导致创建一个额外的行,并且它始终显示在底部。如果清除文本(多行)只有一行被删除,在你键入一个符号后,另一行被删除,另外一行被删除,最后一行被删除。另外,如果你键入一个符号,删除它并再次键入,它会导致创建一行,因此你键入了一个符号和两行。无论你复制了整个方法多长文本,它总是在底部显示为空行?我不知道“没有检测到您所说的bug。除了新的else iInterest之外,还有一些更改,在一个新的项目中,第2行带有第2个符号的bug消失了。但是其他bug是