2012-05-21 20 views
6

Tengo una gran lista de compensaciones que debo resaltar en mi RichTextBox. Sin embargo, este proceso lleva demasiado tiempo. Estoy usando el siguiente código:Resaltar en un RichTextBox tarda demasiado

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

¿Hay alguna manera más eficiente de hacerlo?

ACTUALIZACIÓN:

intentado usar este método, pero no destaca nada:

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

Lo siento, no me di cuenta que la pregunta era sobre winforms. Eliminaré mi respuesta para que su pregunta no tenga respuesta nuevamente. – dasblinkenlight

+0

Gracias de todos modos @dasblinkenlight – user1135357

+0

posible duplicado de [RichTextBox resaltado de sintaxis en tiempo real - Desactivar el repintado] (http://stackoverflow.com/questions/3282384/richtextbox-syntax-highlighting-in-real-time-disabling-the -repaint) –

Respuesta

0

lo hace ninguna diferencia si se establece la SelectionBackColor fuera del bucle?

Al mirar en el RichTextBox con Reflector, se muestra que se envía un WindowMessage al control cada vez que se establece el color. En el caso de una gran cantidad de desplazamientos, esto podría llevar a resaltar las palabras ya resaltadas una y otra vez, lo que llevaría a un comportamiento O (n^2).

+0

Ya lo intenté. Esto no resalta nada: 'richTextBox.SelectionBackColor = Color.Amarillo; foreach (int offset en offsets) { richTextBox.Select (offset, searchString.Length); } ' – user1135357

1

He buscado en Google su problema y he encontrado que RichTextBox se está volviendo muy lento al tener muchas líneas.
En mi opinión, tiene que comprar un control de tercera parte que puede estar satisfecho con su rendimiento o puede necesitar hilos para dividir toda la tarea de selección. Creo que pueden acelerar las cosas.
Espero que ayude!

+0

Supongo que este [control] (http://www.telerik.com/products/winforms/richtextbox.aspx) resolvería mi problema – user1135357

+0

Escuché muchas cosas buenas sobre los controles telerik y devexpress. así que no dude en exponer su problema a ellos y ver qué solución pueden ofrecerle. – HichemSeeSharp

+0

Si termina con una de las soluciones mencionadas anteriormente, por favor márquela como una respuesta. – HichemSeeSharp

1

He tenido este mismo problema antes. Terminé ignorando todos los métodos que le dieron y manipulé los datos RTF subyacentes. Además, la razón por la que su segundo bloque de código no funciona es que RTF aplica el formateo a medida que avanza, por lo que si llama a una función (o propiedad en este caso) para cambiar el color de selección, solo la aplicará para el bloque seleccionado actualmente . Cualquier cambio realizado en la selección después de esa llamada se vuelve irrelevante.

Puede jugar con los valores RGB, o here is a great source sobre cómo hacer cosas diferentes dentro del control RTF. Haga esta función en su código y vea qué tan bien funciona. Lo uso para proporcionar resaltado de sintaxis en tiempo real para código 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

Lamento no haber entendido el código, pero intenté simplemente copiar y pegar el código en mi aplicación y llamar a este método cada vez que quiero resaltar algo pero no lo hice no funciona para nada De todos modos, gracias por tu ayuda. ¡Me doy por vencido! – user1135357

Cuestiones relacionadas