2012-05-21 21 views
6

Mam dużą listę przesunięć, które muszę podświetlić w moim RichTextBox. Jednak proces ten trwa zbyt długo. Używam następujący kod:Wyróżnianie w RichTextBox trwa zbyt długo

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

Czy jest bardziej efektywny sposób to zrobić?

UPDATE:

Próbowałem przy użyciu tej metody, ale to nie ma nic podkreślić:

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

Niestety, nie zdawałem sobie sprawy, że pytanie dotyczyło winformów. Skasuję moją odpowiedź, aby pytanie znów pozostało bez odpowiedzi. – dasblinkenlight

+0

Dzięki i tak @dasblinkenlight – user1135357

+0

możliwy duplikat podświetlania składni RichTextBox w czasie rzeczywistym - Wyłączanie odświeżania] (http://stackoverflow.com/questions/3282384/richtextbox-syntax-highlighting-in-real-time-disabling-tohe -repaint) –

Odpowiedz

0

to robi żadnej różnicy, jeśli ustawić SelectionBackColor zewnątrz pętli?

Wgląd w RichTextBox z reflektorem pokazuje, że WindowMessage jest wysyłany do sterowania za każdym razem, gdy ustawiony jest kolor. W przypadku dużej liczby przesunięć może to prowadzić do wielokrotnego zaznaczania już zaznaczonych słów, prowadząc do zachowania O (n^2).

+0

Już wypróbowałem to. To nic nie wyróżnia: 'richTextBox.SelectionBackColor = Color.Yellow; foreach (int offset w przesunięciach) { richTextBox.Select (offset, searchString.Length); } ' – user1135357

1

Mam googleed twój problem i znalazłem, że RichTextBox staje się bardzo powolny, gdy ma wiele linii.
Moim zdaniem, masz albo kupić trzecią kontrolę części, którą możesz być zadowolony z jej wydajności, albo możesz potrzebować wątków, aby podzielić całe zadanie selekcji. Myślę, że mogą przyspieszyć rzeczy.
Mam nadzieję, że pomoże!

+0

Myślę, że to [kontrola] (http://www.telerik.com/products/winforms/richtextbox.aspx) rozwiąże mój problem – user1135357

+0

Słyszałem wiele dobrych rzeczy o telerikach i kontrolkach devexpress. więc nie wahaj się ujawnić im swojego problemu i zobacz, jakie rozwiązanie mogą Ci zaoferować. – HichemSeeSharp

+0

Jeśli pojawi się jedno z powyższych rozwiązań, zaznacz to jako odpowiedź. – HichemSeeSharp

1

Już wcześniej miałem ten sam problem. Zlekceważyłem wszystkie metody, które ci dają, i zmanipulowałem podstawowe dane RTF. Powodem, dla którego twój drugi blok kodu nie działa, jest to, że RTF stosuje formatowanie, więc jeśli wywołasz funkcję (lub właściwość w tym przypadku), aby zmienić kolor selekcji, zastosuje ją tylko do aktualnie wybranego bloku . Wszelkie zmiany dokonane w selekcji po tym połączeniu stają się niewiarygodne.

Możesz odtwarzać z wartościami RGB lub here is a great source, jak wykonywać różne czynności w ramach sterowania RTF. Pop funkcja ta w kodzie i zobacz, jak działa. Używam go do zapewniania podświetlania składni w czasie rzeczywistym dla kodu SQL.

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 = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}} 
      {\colortbl ;\red255\green255\blue0;}\viewkind4\uc1\pard"; 
     s += sText; 
     s += @"\par}"; 
     richTextBox.Rtf = s; 
    } 
+0

Przykro mi, że nie bardzo rozumiałem twój kod, ale próbowałem po prostu skopiować i wkleić kod w mojej aplikacji i wywołać tę metodę za każdym razem, gdy chcę coś podświetlić, ale nie zrobił tego w ogóle nie działa. W każdym razie, dzięki za pomoc. Poddaję się! – user1135357

Powiązane problemy