使文本框在行尾时自动添加新行

时间:2015-12-11 09:45:35

标签: c# winforms

这似乎是一件容易的事,但是,我找不到任何有效的方法。当我们在整行的末尾键入时,我希望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

2 个答案:

答案 0 :(得分:2)

有点像黑客,但试试这个,看看它是否符合你的需求:

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

答案 1 :(得分:0)

如果设置了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);
        }
    }