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 you
和 r 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
前后的字符,然后拆分字符串。我认为第二个对我来说似乎更好。
我有一个 RichTextBox,这里称为 box
。
string currentline = box.Lines[box.GetLineFromCharIndex(box.SelectionStart)];
那里的那一行获取插入符号所在的行。它工作得很好。
但是,我需要从中获取两个字符串。第一个是该行上到插入符号的所有内容,第二个是该行之后的所有内容。
例如,如果行是 How is you|r day going?
,|
代表插入符号,我将分别得到 How is you
和 r 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
前后的字符,然后拆分字符串。我认为第二个对我来说似乎更好。