Come è possibile scorrere fino a una riga specificata in un oggetto di testo WinForms utilizzando C#?Come è possibile scorrere fino a una riga specificata in un oggetto di testo WinForms utilizzando C#?
Grazie
Come è possibile scorrere fino a una riga specificata in un oggetto di testo WinForms utilizzando C#?Come è possibile scorrere fino a una riga specificata in un oggetto di testo WinForms utilizzando C#?
Grazie
Ecco come si scorre alla selezione:
textBox.ScrollToCaret();
Per scorrere ad una linea specifica, è possibile scorrere la proprietà TextBox.Lines, totale loro lunghezze per trovare l'inizio della linea specificata e quindi impostare TextBox.SelectionStart per posizionare il cursore.
Qualcosa sulla falsariga di questo (codice non testato):
int position = 0;
for (int i = 0; i < lineToGoto; i++)
{
position += textBox.Lines[i].Length;
}
textBox.SelectionStart = position;
textBox.ScrollToCaret();
+1 per capire la domanda :) – SirDemon
ti ringrazio per la risposta ... – alinpopescu
In alternativa, "position = textBox.Text.Length" per evitare il ciclo. –
La risposta loop per trovare la posizione del punto di inserimento corretta ha un paio di problemi. Innanzitutto, per caselle di testo di grandi dimensioni, è lento. Secondo, i personaggi delle schede sembrano confonderlo. Un percorso più diretto è quello di utilizzare il testo sulla linea che si desidera.
String textIWantShown = "Something on this line.";
int position = textBox.Text.IndexOf(textIWantShown);
textBox.SelectionStart = position;
textBox.ScrollToCaret();
Questo testo deve essere univoco, ovviamente, ma è possibile ottenerlo dall'array textBox.Lines. Nel mio caso, ho aggiunto i numeri di riga al testo che stavo visualizzando, quindi questo ha reso la vita più facile.
Looping infatti ha problemi, non ha funzionato per me. Sembrava che il conteggio fosse di 1 su ogni riga. In ogni caso, è possibile utilizzare GetFirstCharIndexFromLine(), che ha funzionato per me. – Joh
-1: A proposito, credo che il tuo metodo sia sbagliato. Cosa succede se l'utente desidera scorrere fino alla riga 1000, che risulta essere vuota? Il tuo codice andrà alla prima occorrenza di "1000", che non deve essere sulla linea 1000. – Joh
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();
}
Questa è la soluzione migliore che ho trovato:
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);
}
Ha il vantaggio, che la posizione di selezione e cursore non viene modificata.
Che tipo di casella di testo (ASP.NET, WinForms, WPF?) E cosa intendete esattamente per "andare a"? Seleziona l'intera linea? Forzarlo per far scorrere la linea in vista? –
WinForms ... sposta il mouse sulla linea specificata – alinpopescu
come loop ican attraverso il TextBox? Sono un principiante nella programmazione – alinpopescu