文本框自动换行:如何将字符串拆分为多行?

4

这是我第一次在这个令人惊叹的服务上发布问题,自从今天开始,仅仅通过阅读它就帮助了我很多。

目前,我正在制作一个小型的C#应用程序,其中需要使用大量的文本框。

在文本框属性中,我已经勾选了MultiLineWord-Wrap功能。因此,当用户输入文本时,它会正确地显示在多行中。

我的问题是如何将这些在表单上显示的行,以字符串列表的形式获取,而不是作为一个大字符串。

我还没有区分出Word-Wrap Function是新建行还是在每行末尾添加"\n\r"。我尝试从TextBox.Lines中获取行,但它只有一个TextBox.Lines[0],其中包含来自TextBox的整个字符串。

我已经尝试了许多方法并研究了许多资源,但我仍然没有找到解决这个问题的正确方法。


1
欢迎来到 Stack Overflow。这是一个不错的首个问题。 - John
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
3个回答

6

这里有很多边角案例。你需要使用的核心方法是TextBox.GetFirstCharIndexFromLine(),它可以让你在TextBox应用了WordWrap属性后迭代每一行。下面是样板代码:

    var lines = new List<string>();
    for (int line = 0; ;line++) {
        var start = textBox1.GetFirstCharIndexFromLine(line);
        if (start < 0) break;
        var end = textBox1.GetFirstCharIndexFromLine(line + 1);
        if (end == -1 || start == end) end = textBox1.Text.Length;
        lines.Add(textBox1.Text.Substring(start, end - start));
    }
    // Do something with lines
    //... 

请注意,行尾符包含在“行”中。

3

可以直接获取行数并构建行数组,包括由于自动换行而生成的行。

// Get the line count then loop and populate array
int lineCount = textBox1.GetLineFromCharIndex(textBox1.Text.Length) + 1;

// Build array of lines
string[] lines = new string[lineCount];
for (int i = 0; i < lineCount; i++)
{
    int start = textBox1.GetFirstCharIndexFromLine(i);
    int end = i < lineCount - 1 ? 
        textBox1.GetFirstCharIndexFromLine(i + 1) :
        textBox1.Text.Length;                            
    lines[i] = textBox1.Text.Substring(start, end - start);
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接