2012-08-07 47 views

Respuesta

16

¿Qué hay de:

static class Utility { 
    public static void HighlightText(this RichTextBox myRtb, string word, Color color) { 

     if (word == string.Empty) 
      return; 

     int s_start = myRtb.SelectionStart, startIndex = 0, index; 

     while((index = myRtb.Text.IndexOf(word, startIndex)) != -1) { 
      myRtb.Select(index, word.Length); 
      myRtb.SelectionColor = color; 

      startIndex = index + word.Length; 
     } 

     myRtb.SelectionStart = s_start; 
     myRtb.SelectionLength = 0; 
     myRtb.SelectionColor = Color.Black; 
    } 
} 
+1

¿Por qué está buscando dos veces la palabra única de la posición de inicio de sesión con: 'while (myRtb.Text.IndexOf (word, startIndex)! = -1) { int index = myRtb.Text.IndexOf (word, startIndex); '? Creo que deberías guardar el índice encontrado en el ciclo while. –

0

se parece a esto lo haría.

http://www.dotnetcurry.com/ShowArticle.aspx?ID=146

int start = 0; 
int indexOfSearchText = 0; 

    private void btnFind_Click(object sender, EventArgs e) 
    { 
     int startindex = 0; 

     if(txtSearch.Text.Length > 0) 
      startindex = FindMyText(txtSearch.Text.Trim(), start, rtb.Text.Length); 

     // If string was found in the RichTextBox, highlight it 
     if (startindex >= 0) 
     { 
      // Set the highlight color as red 
      rtb.SelectionColor = Color.Red; 
      // Find the end index. End Index = number of characters in textbox 
      int endindex = txtSearch.Text.Length; 
      // Highlight the search string 
      rtb.Select(startindex, endindex); 
      // mark the start position after the position of 
      // last search string 
      start = startindex + endindex; 
     } 
    } 

    public int FindMyText(string txtToSearch, int searchStart, int searchEnd) 
    { 
     // Unselect the previously searched string 
     if (searchStart > 0 && searchEnd > 0 && indexOfSearchText >= 0) 
     { 
      rtb.Undo(); 
     } 

     // Set the return value to -1 by default. 
     int retVal = -1; 

     // A valid starting index should be specified. 
     // if indexOfSearchText = -1, the end of search 
     if (searchStart >= 0 && indexOfSearchText >=0) 
     { 
      // A valid ending index 
      if (searchEnd > searchStart || searchEnd == -1) 
      { 
       // Find the position of search string in RichTextBox 
       indexOfSearchText = rtb.Find(txtToSearch, searchStart, searchEnd, RichTextBoxFinds.None); 
       // Determine whether the text was found in richTextBox1. 
       if (indexOfSearchText != -1) 
       { 
        // Return the index to the specified search text. 
        retVal = indexOfSearchText; 
       } 
      } 
     } 
     return retVal; 
    } 

// Reset the richtextbox when user changes the search string 
    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     start = 0; 
     indexOfSearchText = 0; 
    } 
+0

Esto encontrará solo la primera aparición, quiero resaltar toda palabra que coincida con –

0

Esto mostrará todos los criterios buscado al mismo tiempo.

Uso de: 1 Cuadro de texto (para ingresar el texto a buscar) y 1 Botón (para ejecutar la búsqueda).

Introduzca sus criterios de búsqueda dentro del cuadro de texto y presione el botón de búsqueda.

 // On Search Button Click: RichTextBox ("rtb") will display all the words inside the document 
    private void btn_Search_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      if (rtb.Text != string.Empty) 
      {// if the ritchtextbox is not empty; highlight the search criteria 
       int index = 0; 
       String temp = rtb.Text; 
       rtb.Text = ""; 
       rtb.Text = temp; 
       while (index < rtb.Text.LastIndexOf(txt_Search.Text)) 
       { 
        rtb.Find(txt_Search.Text, index, rtb.TextLength, RichTextBoxFinds.None); 
        rtb.SelectionBackColor = Color.Yellow; 
        index = rtb.Text.IndexOf(txt_Search.Text, index) + 1; 
        rtb.Select(); 
       } 
      } 
     } 

     catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); } 
    } 
} 

}

3

Usando este método, usted será capaz de poner de relieve varias palabras al mismo tiempo. O puede omitir fácilmente la parte foreach y usarla para resaltar solo una palabra.

private void HighlightWords(string[] words) 
{ 
    foreach (string word in words) 
    { 
     int startIndex = 0; 
     while (startIndex < rich.TextLength) 
     { 

      int wordStartIndex = rich.Find(word, startIndex, RichTextBoxFinds.None); 
      if (wordStartIndex != -1) 
      { 
       rich.SelectionStart = wordStartIndex; 
       rich.SelectionLength = word.Length; 
       rich.SelectionBackColor = Color.Yellow; 
      } 
      else 
       break; 
      startIndex += wordStartIndex + word.Length; 
     } 
    } 
} 
0

Acepto la solución de Alex Jolig arriba. Pero encontré una cosa, que la última línea,

startIndex + = wordStartIndex + word.Length;

no debería tener + =, en cambio,

startIndex = wordStartIndex + word.Length;

Esto funcionará.

0

Si solo quiere hacer coincidir la palabra completa, puede usar esto, tenga en cuenta que esto ignora el caso y también que | s \ b significa que los plurales se resaltan, p. Gato coincide con los gatos, pero no orugas;

public static void HighlightText(RichTextBox myRtb, string word, Color color) 
    { 
     if (word == string.Empty) 
      return; 
     var reg = new Regex(@"\b" + word + @"(\b|s\b)",RegexOptions.IgnoreCase); 

     foreach (Match match in reg.Matches(myRtb.Text)) 
     { 
      myRtb.Select(match.Index, match.Length); 
      myRtb.SelectionColor = color; 
     } 

     myRtb.SelectionLength = 0; 
     myRtb.SelectionColor = Color.Black; 
    } 
0
private void button3_Click(object sender, EventArgs e) 
    { 
     if (textBox1.Text != "") 
     { 
      for (int i = 0; i < richTextBox1.TextLength; i++) 
      { 
       richTextBox1.Find(textBox1.Text, i, RichTextBoxFinds.None); 
       richTextBox1.SelectionBackColor = Color.Red; 
      } 
     } 
     else 
     { 
      for (int i = 0; i < richTextBox1.TextLength; i++) 
      { 
       richTextBox1.SelectAll(); 
       richTextBox1.SelectionBackColor = Color.White; 
      } 
     } 
    }[lets make it!][1] 
+0

Por favor explique su respuesta en lugar de solo proporcionar el código. Además, aunque su solución parece funcionar, esta pregunta es bastante antigua y ya tiene una respuesta aceptada. Tu ayuda sería mucho más apreciada en las preguntas más nuevas :) –

+0

OK seguro. Agradecido –

+0

Puede encontrar mucha información acerca de cómo funciona este sitio en el Centro de ayuda, por ejemplo: Cómo responder: http://stackoverflow.com/help/how-to- answer –

Cuestiones relacionadas