2009-08-25 9 views

Répondre

1

Je ne sais pas s'il existe un moyen facile de le faire en une seule étape. Vous pouvez utiliser la fonction .split sur la propriété .Text de la riche zone de texte pour obtenir un tableau de lignes

string[] lines = richTextBox1.Text.Split("\n".ToCharArray()) 

puis écrire quelque chose pour ré-assembler le tableau dans une chaîne de texte unique après avoir enlevé la ligne que vous voulu et copiez-le dans la propriété .Text de la zone de texte enrichi.

Voici un exemple simple:

 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; 

Si votre zone de texte enrichi allait avoir plus de 10 lignes ou alors ce serait une bonne idée d'utiliser un StringBuilder au lieu d'une chaîne pour composer le nouveau texte avec.

+2

Cela obtiendraient lent que le nombre de lignes a augmenté. –

+0

Vous avez raison et j'aurais dû mettre un avertissement là-dedans mais pour un nombre raisonnable de lignes (moins de 100?) Ça devrait aller. – TLiebe

+0

J'ai essayé cette fois. Il m'a mordu en perdant mon formatage RTF. –

1

Trouver le texte à supprimer dans une plage de texte, trouvé here Définissez le texte à vider, et maintenant il est parti du document.

4

Une autre solution:

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); 
} 
+0

que fait le bloc "manger de nouveaux caractères"? le -1 -1 ne s'annule-t-il pas? il semblerait d'évaluer à 'count + = 0' réellement ... –

+0

ok je comprends, la longueur ne comprend pas autrement les caractères de fin de ligne, manqué cela. –

2

Essayez ceci:

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/

+0

Lien seule réponse n'est pas bonne.: D Modifier et je vais vous voter Monsieur. –

+1

@CaryBondoc fait, merci pour l'info –

2

Sur la base de la solution de tomanu mais sans les frais généraux

int start_index = LogBox.GetFirstCharIndexFromLine(linescount); 
int count = LogBox.GetFirstCharIndexFromLine(linescount + 1) - start_index; 
LogBox.Text = LogBox.Text.Remove(start_index, count); 

noter que m y linescount ici est linescount - 2.

+0

cela fonctionne-t-il pour la dernière ligne dans la boîte? J'aime le 'int count = richTextBox.Lines [a_line] .Length; –

+0

@Sahuagin Je ne me souviens pas ... – Cynede

+0

en cours d'exécution à travers mes tests, non, il ne le fait pas, même si cela peut être lié à ce que vous dites dans la dernière ligne, je ne sais pas ce que cela signifie. –

2

Cela pourrait également faire l'affaire (si vous pouvez gérer des choses telles que ++ dans le code des formulaires). Conserve le format de texte. Rappelez-vous juste "ReadOnly" attribut travail pour vous et l'utilisateur.

richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(your_line); 
richTextBox.SelectionLength = this.richTextBox.Lines[your_line].Length+1; 
this.richTextBox.SelectedText = String.Empty; 
+0

C'est la seule approche qui ne supprime pas la mise en forme du texte existant. La définition de la propriété Text efface tout formatage existant. Notez également que si votre zone de texte est en lecture seule, définissez Readonly sur false juste avant de modifier SelectedText, puis restaurez Readonly sur true après celui-ci. – Tombala

0

Voici ma mise en œuvre testée à l'unité.

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); 
} 

tests unitaires:

(utilisés \n au lieu de Environment.NewLine depuis au moins pour moi RTB est remplacer automatiquement \r\n avec juste \n)

[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); 
} 
0

Beaucoup de bonnes réponses, mais je trouve beaucoup loin d'être compliqué.

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); 
} 
} 

J'espère que cela aide les autres à certains; 0)

+0

Ceci supprime tout formatage du texte existant. Si vous ne voulez pas supprimer le formatage, vous devez utiliser l'itinéraire "Créer une sélection, puis effacer la sélection". Voir d'autres réponses – Tombala

Questions connexes