使文本框在';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;
    }

但当我只按entershift-enter时,额外的行正在创建。我希望它能自动添加。我还有Multiline=trueWordwrap=true

使文本框在';s一行的末尾

这是一种破解方法,但请尝试一下,看看它是否符合您的需求:

    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);
        }
    }