2010-03-03 5 views
6

Si llamo al textBox.GetLineFromCharIndex(int) en TextBox con WordWrap = true, devuelve el índice de línea como el usuario lo ve (las líneas ajustadas cuentan como líneas múltiples), no la línea de acuerdo con los saltos de línea .Determinar línea lógica del índice de carga (Winforms TextBox)

Line one extends to  // <- word wrapped 
here.      // <- logical line 1, GetLineFromCharIndex returns line 2 
This is line two.   // <- logical line 2, GetLineFromCharIndex returns line 3

¿Alguien sabe de una solución para encontrar la línea lógica de un índice de caracteres en lugar de la línea mostrada?

Respuesta

2

Encuentra el número de ocurrencias de líneas nuevas en todo el texto hasta el índice de tu char.

Quizás primero tome la subcadena del texto del cuadro de texto hasta el índice de su char. Use Dividir en nuevas líneas y cuente el resultado.

Alternativamente, una solución de bucle usaría funciones de índice y contaría cuántas líneas nuevas se encuentran hasta su índice de char.

+0

Terminé yendo con la solución de bucle. ¡Gracias! –

1

Me inclino a pensar que esta solución funciona más rápido que buscar las nuevas líneas. Usted necesita 'SendMessage' al cuadro de texto con el 'EM_LINEFROMCHAR' mensaje

 
[DllImport("User32.DLL")] 
public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 

public const int EM_LINEFROMCHAR = 0xC9; 

int noLines = SendMessage(TextBox.Handle, EM_LINEFROMCHAR, TextBox.TextLength, 0); 

De esa manera, se entera de la última línea en base a la longitud de la cadena ... y que va a decir el número de líneas lógicas utilizadas ...

Espero que esto ayude,

+0

Desafortunadamente, 'GetLineFromCharIndex' usa' EM_LINEFROMCHAR' bajo el capó ... –

+0

@Zach: oh ... No me di cuenta de que ... tbqh ... ese método rara vez se usa cuando se trabaja ... buena captura .... – t0mm13b

0

también puede utilizar las extensiones de cadenas métodos wuth una expresión lambda Func o lo que sea, si usted no se siente como escribir un loop-

long lineNumber = textBox.Text.Substring(0, textBox.SelectionStart).LongCount(chr => chr == '\r'); 

Esto devolverá la numeración de líneas basada en 0.

0

Los siguientes trabajó para mí - sin golpear el rendimiento visible

this.WordWrap = false; 
int lineIndex = this.GetLineFromCharIndex(this.SelectionStart); 
string lineText = this.Lines[lineIndex]; 
this.WordWrap = true; 
+0

Lamentablemente para mí, con 5000 líneas de texto está "parpadeando"/redibujando por alrededor de un segundo ... –

Cuestiones relacionadas