ScrollToCaret

Molto spesso trovo comodo segnalare gli step di esecuzione di un programma attraverso dei messaggi scritti in una text box. Supponete ad esempio di avere in esecuzione una sfilza di stringhe sql di update o, ad esempio, il rename di una serie di file e di volerne mostrare l’andamento.

Come prima cosa piazziamo la nostra texbox sul Form e la chiamiamo tbxLogMessages.Siccome siamo bravi, sappiamo che l’operazione che andremo ad eseguire potrebbe essere lunga e la eseguiamo in un thread separato (che non è oggetto di questo post quindi non ne parlo).Siccome ormai lo abbiamo sentito ripetere 1.000.000 di volte, sappiamo anche se dai thread secondari NON DOBBIAMO MAI AGGIORNARE LA UI (lo sapevate vero???) quindi usiamo il BeginInvoke (anche questo non è oggetto del post e ne parlo in un secondo momento). Arrivati fin qui, avviamo la nostra fantastica applicazione, vediamo i messaggi arrivare sulla textBox ma, i messaggi son tanti e li vediamo sparire oltre il limite inferiore e siamo costretti a leggerli muovendo la barra di scorrimento. E’ una cosa brutta quindi ci documentiamo e vediamo che esiste un metodo denominato ScrollToCaret() che stando alla documentazione, dovrebbe automaticamente scorrere il testo fino al cursore.Modifichiamo il nostro codice aggiungendo la riga:

1    tbxLogMessages.ScrollToCaret()

rimandiamo in esecuzione e……di nuovo come prima: il testo non scorre. Ma come? ScrollTocaret() non fa quello che dice di fare?Al contrario: quel metodo scrolla effettivamente il testo fino alla posizione del cursore. Peccato però che il cursore, dato che non stiamo scrivendo a mano nella textBox, si trovi a sinistra del primo carattere….in alto.Per far funzionare correttamente quel metodo, dobbiamo PRIMA spostare il cursore e lo facciamo col seguente codice:

1    tbxLogMessages.SelectionStart = tbxLogMessages.Text.Length;

Poi possiamo chiamare ScrollTocaret() e vedere il nostro testo scorrere effettivamente.Di seguito il frammento di codice completo:

1    public void InvokeMethod(string text) {
2      tbxLogMessages.Text += text+"rn";
3      tbxLogMessages.SelectionStart = tbxLogMessages.Text.Length;
4      tbxLogMessages.ScrollToCaret();
5    }

Stasera è stata la 3 volta che cercavo la stessa informazione così….ci ho fatto un post…chissà la prossima volta…..