2010-03-03 12 views
6

Se chiamo textBox.GetLineFromCharIndex(int) in un TextBox con WordWrap = true, restituisce l'indice di riga come l'utente vede (linee avvolti contano come più linee), non la linea secondo le interruzioni di riga .Determinare linea logica da char Index (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

Qualcuno sa di una soluzione per trovare la linea logica da un indice di carattere anziché dalla riga visualizzata?

risposta

2

Trova il numero di occorrenze di nuove righe nell'intero testo fino all'indice char.

Forse prima prendere la sottostringa del testo della casella di testo fino all'indice char. Usa Dividi su una nuova riga e conta il risultato.

In alternativa, una soluzione di loop utilizza le funzioni di indice e conta quante righe di nuova riga vengono rilevate nell'indice char.

+0

ho finito per andare con la soluzione di loop. Grazie! –

1

Sarei incline a pensare che questa soluzione funzioni più velocemente di una ricerca di linee nuove. È necessario 'SendMessage' alla casella di testo con il messaggio 'EM_LINEFROMCHAR'

 
[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); 

In questo modo, si scopre l'ultima riga in base alla lunghezza della stringa ... e che vi dirà il numero di linee logiche utilizzate ...

Spero che questo aiuti,

+0

Sfortunatamente, 'GetLineFromCharIndex' usa' EM_LINEFROMCHAR' sotto il cofano ... –

+0

@Zach: oh .... non mi sono reso conto che ... tbqh ... quel metodo è usato raramente quando si lavora .... buona cattura .... – t0mm13b

0

È inoltre possibile utilizzare le estensioni di stringa metodi wuth un Func, espressione lambda o qualsiasi altra cosa se non avete voglia di scrivere un loop-

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

Ciò restituirà la numerazione delle righe basata su 0.

0

Di seguito ha lavorato per me - senza prestazioni visibile colpito

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

Tristemente per me con 5000 righe di testo è "lampeggiante"/ridisegna per circa un secondo .... –