使文本框在';s一行的末尾
本文关键字:一行 文本 | 更新日期: 2023-09-27 18:26:27
这似乎是一项简单的任务,但我找不到任何工作方法。我希望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
。
这是一种破解方法,但请尝试一下,看看它是否符合您的需求:
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;
}
}
如果设置了MultiLine
,您可以这样做:
1) 通过将TextBox
中最后一行文本拆分为一个数组(可能不是最快的)来估计其长度
2) 如果该行有更多的MAX_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);
}
}