删除.NET RichTextBox中的特定行
我不知道是否有一个简单的方法来做到这一步。您可以使用.Split功能上的丰富文本框。文本属性来获取线
string[] lines = richTextBox1.Text.Split("\n".ToCharArray())
的数组,然后写的东西去掉,你行后,重新组装阵列成一个单一的文本字符串并将其复制回富文本框的.Text属性。
这里有一个简单的例子:如果您的富文本框将不得不超过10行左右,这将是使用StringBuilder而不是字符串来组成新的文本是一个好主意
string[] lines = richTextBox1.Text.Split("\n".ToCharArray());
int lineToDelete = 2; //O-based line number
string richText = string.Empty;
for (int x = 0 ; x < lines.GetLength(0) ; x++)
{
if (x != lineToDelete)
{
richText += lines[ x ];
richText += Environment.NewLine;
}
}
richTextBox1.Text = richText;
用。
另一种解决方案:
private void DeleteLine(int a_line)
{
int start_index = richTextBox.GetFirstCharIndexFromLine(a_line);
int count = richTextBox.Lines[a_line].Length;
// Eat new line chars
if (a_line < richTextBox.Lines.Length - 1)
{
count += richTextBox.GetFirstCharIndexFromLine(a_line + 1) -
((start_index + count - 1) + 1);
}
richTextBox.Text = richTextBox.Text.Remove(start_index, count);
}
“吃新的字符”块有什么作用?不是-1 +1取消了吗?它似乎实际上评估为“计数+ = 0”...... – 2015-11-27 18:30:15
好的我明白了,长度不包括行尾字符,错过了。 – 2015-11-27 18:42:04
试试这个:基于tomanu的解决方案,但没有开销
int start_index = LogBox.GetFirstCharIndexFromLine(linescount);
int count = LogBox.GetFirstCharIndexFromLine(linescount + 1) - start_index;
LogBox.Text = LogBox.Text.Remove(start_index, count);
注意m
Dim lst As New ListBox
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Controls.Add(lst)
For Each cosa As String In Me.RichTextBox1.Lines
lst.Items.Add(cosa)
Next
lst.Items.RemoveAt(2) 'the integer value must be the line that you want to remove -1
Me.RichTextBox1.Text = String.Empty
For i As Integer = 0 To lst.Items.Count - 1
If Me.RichTextBox1.Text = String.Empty Then
Me.RichTextBox1.Text = lst.Items.Item(i)
Else
MeMe.RichTextBox1.Text = Me.RichTextBox1.Text & Environment.NewLine & lst.Items.Item(i).ToString
End If
Next
End Sub
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/63647481-743d-4e55-9043-e0db5106a03a/
链接唯一答案不好。:D编辑它,我会投票给你,先生。 – 2015-11-09 03:02:59
@CaryBondoc完成了,感谢信息 – 2015-11-09 10:00:34
y linescount here is linescount - 2.
是否为盒子中的最后一行工作?我喜欢tomanu的'int count = richTextBox.Lines [a_line] .Length;'更好。 – 2015-11-27 18:26:29
@Sahuagin我不记得... – Cynede 2015-11-30 04:45:51
通过我的测试运行它,不,它不会,虽然它可能与你在最后一行说的内容有关,但不确定这意味着什么。 – 2015-12-01 16:30:04
这也可以做到这一点(如果你可以在窗体代码中处理诸如++之类的东西)。保持文本格式。只记得您和用户的“只读”属性。
richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(your_line);
richTextBox.SelectionLength = this.richTextBox.Lines[your_line].Length+1;
this.richTextBox.SelectedText = String.Empty;
这是不从现有文本中删除格式的唯一方法。设置Text属性将清除所有现有的格式。还要注意,如果您的文本框是只读的,请在修改SelectedText之前将Readonly设置为false,然后在它之后将Readonly恢复为true。 – Tombala 2016-10-24 13:38:37
这是我的单元测试的实现。
public static void DeleteLine([NotNull] this RichTextBox pRichTextBox, int pLineIndex) {
if (pLineIndex < 0 || pLineIndex >= pRichTextBox.Lines.Length)
throw new InvalidOperationException("There is no such line.");
var start = pRichTextBox.GetFirstCharIndexFromLine(pLineIndex);
var isLastLine = pLineIndex == pRichTextBox.Lines.Length - 1;
var nextLineIndex = pLineIndex + 1;
var end = isLastLine
? pRichTextBox.Text.Length - 1
: pRichTextBox.GetFirstCharIndexFromLine(nextLineIndex) - 1;
var length = end - start + 1;
pRichTextBox.Text = pRichTextBox.Text.Remove(start, length);
}
单元测试:
[TestMethod]
public void TestDeleteLine_SingleLine() {
var rtb = new RichTextBox();
rtb.Text = "This is line1.\n";
rtb.DeleteLine(0);
var expected = "";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_BlankLastLine() {
var rtb = new RichTextBox();
rtb.Text = "\n";
rtb.DeleteLine(1);
var expected = "\n";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_SingleLineNoEOL() {
var rtb = new RichTextBox();
rtb.Text = "This is line1.";
rtb.DeleteLine(0);
var expected = "";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_FirstLine() {
var rtb = new RichTextBox();
rtb.Text = "This is line1.\nThis is line2.\nThis is line3.";
rtb.DeleteLine(0);
var expected = "This is line2.\nThis is line3.";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_MiddleLine() {
var rtb = new RichTextBox();
rtb.Text = "This is line1.\nThis is line2.\nThis is line3.";
rtb.DeleteLine(1);
var expected = "This is line1.\nThis is line3.";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_LastLine() {
var rtb = new RichTextBox();
rtb.Text = "This is line1.\nThis is line2.\nThis is line3.";
rtb.DeleteLine(2);
var expected = "This is line1.\nThis is line2.\n";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_OneBlankLine() {
var rtb = new RichTextBox();
rtb.Text = "\n";
rtb.DeleteLine(0);
var expected = "";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod]
public void TestDeleteLine_BlankLines() {
var rtb = new RichTextBox();
rtb.Text = "\n\n\n\n\n";
rtb.DeleteLine(2);
var expected = "\n\n\n\n";
Assert.AreEqual(expected, rtb.Text);
}
[TestMethod, ExpectedException(typeof(InvalidOperationException))]
public void TestDeleteLine_Exception_BeforeFront() {
var rtb = new RichTextBox();
rtb.Text = "\n\n\n\n\n";
rtb.DeleteLine(-1);
}
[TestMethod, ExpectedException(typeof(InvalidOperationException))]
public void TestDeleteLine_Exception_AfterEnd() {
var rtb = new RichTextBox();
rtb.Text = "\n\n";
rtb.DeleteLine(3);
}
很多好的答案(因为至少使用\n
代替Environment.NewLine
我RTB自动与刚刚\n
更换\r\n
),但我发现很多很复杂。
string[] LinesArray = this.richTextBox1.Lines;
this.richTextBox1.Clear();
for (int line = 0; line < LinesArray.Length; line++)
{
if (!LinesArray[line].Contains("< Test Text To Remove >"))
{
this.richTextBox1.AppendText(LinesArray[line] + Environment.NewLine);
}
}
我希望这可以帮助别人一些; 0)
这将删除现有文本中的所有格式。如果您不想删除格式,则必须使用“创建选择,然后清除选择”的路线。查看其他答案。 – Tombala 2016-10-24 13:36:55
这会很慢作为线的数量增加。 – 2009-08-25 16:48:05
你是对的,我应该在那里提出一个警告,但对于合理数量的行(少于100?)应该没问题。 – TLiebe 2009-08-25 16:54:52
我试过一次。它让我失去了我的RTF格式。 – 2016-01-15 17:39:39