C# - 根据插入符位置将 RichTextBox 行一分为二

C# - split a RichTextBox line in two based on the caret position

我有一个 RichTextBox,这里称为 box

string currentline = box.Lines[box.GetLineFromCharIndex(box.SelectionStart)];

那里的那一行获取插入符号所在的行。它工作得很好。

但是,我需要从中获取两个字符串。第一个是该行上到插入符号的所有内容,第二个是该行之后的所有内容。

例如,如果行是 How is you|r day going?| 代表插入符号,我将分别得到 How is your day going?

我写了这个怪物,有效:

string allbefore = box.Text.Substring(0, box.SelectionStart);
string allafter = box.Text.Substring(box.SelectionStart, box.Text.Length - box.SelectionStart);
string linebefore = "";
for (int i = 0; i < allbefore.Length; i++)
{
    linebefore += allbefore[i];
    if (allbefore[i] == '\n')
        linebefore = "";
}
string lineafter = "";
for (int i = 0; i < allafter.Length; i++)
{
    if (allafter[i] == '\n')
        break;
    else
        lineafter += allafter[i];
}

它给了我想要的结果,但涉及遍历整个框中的每个字符,这很痛苦。有没有一种简单的方法可以做到这一点我只是想念?谢谢。

您尝试过使用 line.split 吗?不确定这是不是你想要的。

使用indexOf存储\n的位置,如果>=0,即字符串包含它,使用substring,否则赋值。

string allbefore = box.Text.Substring(0, box.SelectionStart);
string allafter = box.Text.Substring(box.SelectionStart, box.Text.Length - box.SelectionStart);
int newLinePos = allBefore.lastIndexOf("\n");
string lineBefore = ((newLinePos >= 0) ? (allBefore.substring(newLinePos + 1)) : (allBefore));
    newLinePos = allafter.indexOf("\n");
string lineAfter = ((newLinePost >= 0) ? (allAfter.substring(0, newLinePos)) : (allAfter));

这可能对你有用

string currentline = box.Lines[box.GetLineFromCharIndex(box.SelectionStart)];
var listOfStrings = new List<string>();
string[] splitedBox = currentline.Split('|');
foreach(string sp in splitedBox)
{
    string[] lineleft = sp.Split('\n');
    listOfStrings.Add(lineleft[lineleft.Count() - 1]);
}

在第一种方法中,我们按字符 | 拆分行,而不是查找是否有 \n 如果存在,我们将相应地取值

另一种方法可能是

string box = "How is \n you|r day \n going?";
bool alllinesremoved = true;
while(alllinesremoved)
{
    if(box.Contains('\n'))
    {
        if(box.IndexOf('\n') > box.IndexOf('|'))
        {
            box = box.Remove(box.IndexOf('\n'), (box.Length - box.IndexOf('\n')));
        }
        else
        {
            box = box.Remove(0, box.IndexOf('\n') + 1);
        }
    }
    else
    {
        alllinesremoved = false;
    }
}
string[] splitedBox = box.Split('|');

在第二种方法中,我们删除 \n 前后的字符,然后拆分字符串。我认为第二个对我来说似乎更好。