TextBox 自动换行将字符串拆分为行

问题描述 投票:0回答:4

这是我第一次就这个令人惊叹的服务发布问题,因为今天它通过阅读它对我有很大帮助。

目前,我正在制作小型 C# 应用程序,需要使用大量文本框。 在 TextBox Properties 中,我检查了 MultiLineWord-Wrap 函数。 因此,当用户输入文本时,它会正确显示在多行中。

我的问题是如何获取显示在表单上的字符串列表中的那些行,而不是一个大字符串。

我还没有区分天气自动换行功能换行或添加“ ” 在每行的末尾。 我尝试从 TextBox.Lines 获取行,但它只有 TextBox.Lines[0],其中包含整个字符串形式 TextBox

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

c# string textbox word-wrap
4个回答
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
    //... 

请注意,行尾包含在lines中。


3
投票

可以直接获取行数并构建行数组。这包括由于 WordWrap 生成的行。

// 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
投票

您可以拉出单个

string
,然后用它做任何您想做的事。

根据分隔符将字符串拆分为字符串列表非常简单:

https://stackoverflow.com/a/1814568/13895


0
投票

有点旧,但我很难找到这个主题的解决方案,所以我想添加一个链接到我所做的事情。

如前所述,仅在单词边界上分割字符串非常简单。 当您开始添加其他约束(例如统一线长度)时,问题会变得有趣。

这是一些执行此操作的代码。

© www.soinside.com 2019 - 2024. All rights reserved.