/ / Podświetlanie w RichTextBox trwa zbyt długo - C #, WinForms, Richtextbox, Podświetlanie

Wyróżnianie w RichTextBox trwa zbyt długo - c #, winformy, richtextbox, podświetlanie

Mam dużą listę przesunięć, które muszę zaznaczyć w moim RichTextBox. Jednak ten proces trwa zbyt długo. Używam następującego kodu:

foreach (int offset in offsets)
{
richTextBox.Select(offset, searchString.Length);
richTextBox.SelectionBackColor = Color.Yellow;
}

Czy jest na to skuteczniejszy sposób?

AKTUALIZACJA:

Próbowałem użyć tej metody, ale niczego nie wyróżnia:

richTextBox.SelectionBackColor = Color.Yellow;
foreach (int offset in offsets)
{
richTextBox.Select(offset, searchString.Length);
}

Odpowiedzi:

1 dla odpowiedzi № 1

Przeszukałem Twój problem w Google i odkryłem, że RichTextBox działa bardzo wolno, gdy jest wiele wierszy.
Moim zdaniem albo kupujesz kontrolkę trzeciej części, z której możesz być zadowolony, albo możesz potrzebować wątków do podzielenia całego zadania selekcyjnego. Myślę, że mogą przyspieszyć.
Mam nadzieję, że to pomoże !


1 dla odpowiedzi nr 2

Miałem wcześniej ten sam problem. Skończyło się na tym, że zignorowałem wszystkie metody, które ci dają, i manipulowałem podstawowymi danymi RTF. Powodem, dla którego twój drugi blok kodu nie działa, jest to, że RTF stosuje formatowanie na bieżąco, więc jeśli wywołasz funkcję (lub właściwość w tym przypadku), aby zmienić kolor zaznaczenia, zastosuje ją tylko do aktualnie wybranego bloku . Wszelkie zmiany dokonane w zaznaczeniu po tym wywołaniu stają się nieistotne.

Możesz bawić się wartościami RGB lub tutaj jest świetne źródło o tym, jak robić różne rzeczy w ramach kontroli RTF. Umieść tę funkcję w swoim kodzie i zobacz, jak dobrze działa. Używam go do podświetlania składni kodu SQL w czasie rzeczywistym.

    public void HighlightText(int offset, int length)
{
String sText = richTextBox.Text.Trim();
sText = sText.Insert(offset + length - 1, @" highlight0");
sText = sText.Insert(offset, @" highlight1");
String s = @"{rtf1ansideff0{fonttbl{f0fnilfcharset0 Courier New;}}
{colortbl ;red255green255blue0;}viewkind4uc1pard";
s += sText;
s += @"par}";
richTextBox.Rtf = s;
}

0 dla odpowiedzi № 3

Czy ma to znaczenie, jeśli ustawisz SelectionBackColor poza pętlą?

Patrząc na RichTextBox z Reflektorempokazuje, że wiadomość WindowMessage jest wysyłana do kontrolki za każdym razem, gdy ustawiany jest kolor. W przypadku dużej liczby przesunięć może to prowadzić do ciągłego podświetlania już podświetlonych słów, prowadząc do zachowania O (n ^ 2).