Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使文本框在';这是一条线的尽头_C#_Winforms - Fatal编程技术网

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这类代码与我的代码结合使用。但它在第二行之后正确地添加了行。此外,我们可以返回并向以前的任何字符串添加更多字符,字符大小也不同,10x
w
填充了行,但10x
f
填充了行。总体上看起来不太好。以此为起点。而不是最大字符可以使用您的MeasureText或任何其他。如果用户返回,您可以对当前行进行检查。重点是分析该行并使用子字符串插入换行符。这很有效!只有一点,当我们键入一些文本时,我们会按照我的意愿添加行,但当我们清除文本框时,大小不会更改为一行。请尝试编辑答案,以便在清除文本时调整文本框一些错误:如果在第2行中连续键入第2个符号会导致创建一个额外的行,并且它始终显示在底部。如果清除文本(多行)只有一行被删除,在你键入一个符号后,另一行被删除,另外一行被删除,最后一行被删除。另外,如果你键入一个符号,删除它并再次键入,它会导致创建一行,因此你键入了一个符号和两行。无论你复制了整个方法多长文本,它总是在底部显示为空行?我不知道“没有检测到您所说的bug。除了新的else iInterest之外,还有一些更改,在一个新的项目中,第2行带有第2个符号的bug消失了。但是其他bug是