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à:
- MultiLine =true
- ReadOnly= true
- 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();
}
}