2009-01-18 18 views
6

Làm cách nào để tô màu đỏ mỗi lần tôi gặp chữ "A" trong RichTextBox?Chọn lọc tô màu văn bản trong RichTextBox

+0

Có thể trùng lặp [Màu khác nhau của một chuỗi RichTextBox] (https: // stackoverflow.com/questions/1926264/color-different-parts-of-a-richtextbox-string) –

Trả lời

26

Hãy thử điều này:

static void HighlightPhrase(RichTextBox box, string phrase, Color color) { 
    int pos = box.SelectionStart; 
    string s = box.Text; 
    for (int ix = 0; ;) { 
    int jx = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase); 
    if (jx < 0) break; 
    box.SelectionStart = jx; 
    box.SelectionLength = phrase.Length; 
    box.SelectionColor = color; 
    ix = jx + 1; 
    } 
    box.SelectionStart = pos; 
    box.SelectionLength = 0; 
} 

...

private void button1_Click(object sender, EventArgs e) { 
    richTextBox1.Text = "Aardvarks are strange animals"; 
    HighlightPhrase(richTextBox1, "a", Color.Red); 
} 
1

này sẽ không làm việc trong khi bạn đang gõ nếu đó là những gì bạn đang tìm kiếm, nhưng tôi sử dụng này để làm nổi bật chuỗi con:

Function Highlight(ByVal Search_Str As Object, ByVal InputTxt As String, ByVal StartTag As String, ByVal EndTag As String) As String 
    Highlight = Regex.Replace(InputTxt, "(" & Regex.Escape(Search_Str) & ")", StartTag & "$1" & EndTag, RegexOptions.IgnoreCase) 
End Function 

và gọi nó theo cách này:

 
Highlight("A", "Color All my A's red", [span class=highlight]', '[/span]') 

Nơi lớp 'đánh dấu' có bất kỳ mã màu/định dạng nào bạn muốn:

 
.highlight {text-decoration: none;color:black;background:red;} 

BTW: bạn cần thay đổi thứ OSE dấu ngoặc vuông để những góc cạnh ... họ sẽ không đi qua khi tôi gõ họ ...

+0

cảm ơn vì sự giúp đỡ, nhưng bạn có mã C# không? – Gold

1

Đây là C# mã cho câu trả lời EJ Brennan của:

public string Highlight(object Search_Str, string InputTxt, string StartTag, string EndTag) 
{ 
    return Regex.Replace(InputTxt, "(" + Regex.Escape(Search_Str) + ")", StartTag + "$1" + EndTag, RegexOptions.IgnoreCase); 
} 
2

Dưới đây là một đoạn ra khỏi lớp wrapper của tôi để làm công việc này:

private delegate void AddMessageCallback(string message, Color color); 

    public void AddMessage(string message) 
    { 
     Color color = Color.Empty; 

     string searchedString = message.ToLowerInvariant(); 

     if (searchedString.Contains("failed") 
      || searchedString.Contains("error") 
      || searchedString.Contains("warning")) 
     { 
      color = Color.Red; 
     } 
     else if (searchedString.Contains("success")) 
     { 
      color = Color.Green; 
     } 

     AddMessage(message, color); 
    } 

    public void AddMessage(string message, Color color) 
    { 
     if (_richTextBox.InvokeRequired) 
     { 
      AddMessageCallback cb = new AddMessageCallback(AddMessageInternal); 
      _richTextBox.BeginInvoke(cb, message, color); 
     } 
     else 
     { 
      AddMessageInternal(message, color); 
     } 
    } 

    private void AddMessageInternal(string message, Color color) 
    { 
     string formattedMessage = String.Format("{0:G} {1}{2}", DateTime.Now, message, Environment.NewLine); 

     if (color != Color.Empty) 
     { 
      _richTextBox.SelectionColor = color; 
     } 
     _richTextBox.SelectedText = formattedMessage; 

     _richTextBox.SelectionStart = _richTextBox.Text.Length; 
     _richTextBox.ScrollToCaret(); 
    } 

Bây giờ bạn có thể gọi bằng AddMessage("The command failed") để tự động đánh dấu bằng màu đỏ. Hoặc bạn có thể gọi nó bằng AddMessage("Just a special message", Color.Purple) để xác định màu đặc biệt (Ví dụ: hữu ích trong các khối bắt để xác định màu cụ thể, bất kể nội dung thư)

+0

Cảm ơn Oliver, mã của bạn đã giúp tôi! – Maro