2009-04-11 23 views
12

¿Cómo puedo desplazarme a una línea específica en un cuadro de texto de WinForms usando C#?¿Cómo puedo desplazarme a una línea específica en un cuadro de texto de WinForms usando C#?

Gracias

+0

¿Qué tipo de cuadro de texto (ASP.NET, WinForms, WPF?) Y qué quiere decir exactamente con "ir a"? Seleccione toda la linea? ¿Forzarlo para desplazar la línea a la vista? –

+0

WinForms ... mueva el mouse a la línea especificada – alinpopescu

+0

¿cómo se puede hacer un loop a través del TextBox? soy un principiante en la programación – alinpopescu

Respuesta

26

He aquí cómo se desplaza a la selección:

textBox.ScrollToCaret(); 

para desplazarse a una línea especificada, se puede recorrer la propiedad TextBox.Lines, el total de sus longitudes para encontrar el principio de la línea especificada y luego establecer TextBox.SelectionStart para colocar el cursor.

Algo a lo largo de las líneas de este (código no probado):

int position = 0; 

for (int i = 0; i < lineToGoto; i++) 
{ 
    position += textBox.Lines[i].Length; 
} 

textBox.SelectionStart = position; 

textBox.ScrollToCaret(); 
+0

+1 para entender la pregunta :) – SirDemon

+0

gracias por su respuesta ... – alinpopescu

+3

Alternativamente, "position = textBox.Text.Length" para evitar el ciclo. –

0

La respuesta de bucle para encontrar la posición correcta de intercalación tiene un par de problemas. En primer lugar, para los cuadros de texto grandes, es lento. En segundo lugar, los caracteres de pestañas parecen confundirlo. Una ruta más directa es usar el texto en la línea que desee.

String textIWantShown = "Something on this line."; 
int position = textBox.Text.IndexOf(textIWantShown); 
textBox.SelectionStart = position; 
textBox.ScrollToCaret(); 

Este texto debe ser único, por supuesto, pero puede obtenerlo de la matriz textBox.Lines. En mi caso, había antepuesto los números de línea al texto que estaba mostrando, así que esto hizo la vida más fácil.

+0

El bucle tiene problemas, no funcionó. yo. Parecía como si el recuento fuera 1 por cada línea. En cualquier caso, uno puede usar GetFirstCharIndexFromLine(), que funcionó para mí. – Joh

+0

-1: Por cierto, creo que su método es incorrecto. ¿Qué ocurre si el usuario desea desplazarse a la línea 1000, que está vacía? Su código irá a la primera aparición de "1000", que no necesita estar en la línea 1000. – Joh

9
private void MoveCaretToLine(TextBox txtBox, int lineNumber) 
    { 
     txtBox.HideSelection = false; 
     txtBox.SelectionStart = txtBox.GetFirstCharIndexFromLine(lineNumber - 1); 
     txtBox.SelectionLength = txtBox.Lines[lineNumber - 1].Length; 
     txtBox.ScrollToCaret(); 
    } 
1

Ésta es la mejor solución que he encontrado:

const int EM_GETFIRSTVISIBLELINE = 0x00CE; 
const int EM_LINESCROLL = 0x00B6; 

[DllImport("user32.dll")] 
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); 

void SetLineIndex(TextBox tbx, int lineIndex) 
{ 
    int currentLine = SendMessage(textBox1.Handle, EM_GETFIRSTVISIBLELINE, 0, 0); 
    SendMessage(tbx.Handle, EM_LINESCROLL, 0, lineIndex - currentLine); 
} 

Tiene la ventaja, de que la posición de selección y símbolo de intercalación no se cambia.

Cuestiones relacionadas