这是我第一次就这个令人惊叹的服务发布问题,因为今天它通过阅读它对我有很大帮助。
目前,我正在制作小型 C# 应用程序,需要使用大量文本框。 在 TextBox Properties 中,我检查了 MultiLine 和 Word-Wrap 函数。 因此,当用户输入文本时,它会正确显示在多行中。
我的问题是如何获取显示在表单上的字符串列表中的那些行,而不是一个大字符串。
我还没有区分天气自动换行功能换行或添加“ ” 在每行的末尾。 我尝试从 TextBox.Lines 获取行,但它只有 TextBox.Lines[0],其中包含整个字符串形式 TextBox
我已经尝试了很多事情并研究了很多资源,但我仍然没有找到解决这个问题的正确解决方案。
这里有很多极端情况。 您要使用的核心方法是
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中。
可以直接获取行数并构建行数组。这包括由于 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);
}
有点旧,但我很难找到这个主题的解决方案,所以我想添加一个链接到我所做的事情。
如前所述,仅在单词边界上分割字符串非常简单。 当您开始添加其他约束(例如统一线长度)时,问题会变得有趣。