Un semplice tip per utilizzare un controllo text-box come finestra di stato o log in un applicazione Windows Form.

Creato un controllo System.Windows.Forms.TextBox, ed aggiunto alla form su cui visualizzare gli eventi, si impostano le seguenti proprietà:

  1. MultiLine =true
  2. ReadOnly= true
  3. ScrollBars=ScrollBars.Both

Di seguito il codice di esempio che esegue il log di una riga, in questo caso aggiungendo data ed ora, spostando il cursore alla fine del testo e forzando quindi uno scorrimento (scroll) verso il basso.

    public partial class Form1 : Form

    {

        private static int counter;

        ...

        private void btnLog_Click(object sender, EventArgs e)

        {

            LogText("Evento # " +

                counter.ToString());

 

            counter++;

        }

 

        void LogText(string RowLog)

        {

            if (string.IsNullOrEmpty(RowLog))

            {

                return;

            }

 

            string Riga = string.Format(

                "{0} {1}\r\n", DateTime.Now.ToString(), RowLog);

 

            //Aggiunge il log e forza uno scorrimento

            txtLog.Text += Riga;

            txtLog.Select(txtLog.Text.Length, 0);

            txtLog.ScrollToCaret();

        }

    }

Ecco come si presenta l’applicazione di esempio.

Può essere utile aggiungere un controllo (come suggerito da franx) sul contenuto della TextBox in modo da prevenire il degrado delle prestazioni e contenere l'occupazione di memoria, quando vengono inserite numerose righe di log . Ecco di seguito una versione della funzione che include anche questo controllo, effettuando un taglio sulle prime righe secondo due parametri specificati.

    public partial class Form1 : Form

    {

       ... 

        private const int cTextBoxMaxLogLength = 2000; //2Kb di limite textbox log

        private const int cTextBoxRemLogLength = 1000; //rimuove 1k quando supera il limite

        private const string cStrCarReturnLnFeed = "\r\n";

       ... 

        void LogText(string RowLog)

        {

            if (string.IsNullOrEmpty(RowLog))

            {

                return;

            }

 

            string Riga = string.Format(

                "{0} {1}{2}", DateTime.Now.ToString(), RowLog, cStrCarReturnLnFeed);

 

            //Controlla il limite e taglia il contenuto della textbox

            if (txtLog.Text.Length > cTextBoxMaxLogLength)

            {

                int PosToRemove = txtLog.Text.LastIndexOf(

                    cStrCarReturnLnFeed, cTextBoxRemLogLength);

                txtLog.Text = txtLog.Text.Substring(

                    PosToRemove + cStrCarReturnLnFeed.Length);

            }

 

            //Aggiunge il log e forza uno scorrimento

            txtLog.Text += Riga;

            txtLog.Select(txtLog.Text.Length, 0);

            txtLog.ScrollToCaret();

        }

    }