locked
Compteur dans texte RRS feed

  • Question

  • Bonjour, J'ai un probléme d'édition dans la fenêtre de sortie d'un programme développé en CSharp avec VS2005.

    Je pensais utiliser un contrôle TextBox, mais celui-ci ne semble pas convenir à mes besoins.

    La sortie du programme est constituée d'un nombre indéterminé de lignes de texte qu'il est facile d'ajouter au TextBox avec la méthode AppendText.

    Le problème est qu'entre ces différentes parties de texte, je voudrais inclure en plusieurs endroits un compteur indiquant à l'utilisateur le nombre de fichiers traités par le programme, afin de lui permettre de suivre de visu l'évolution du nombre de fichiers traités.

    Il faudrait donc que je puisse écrire un certain nombre de fois au même endroit dans la TextBox sans redessiner tout le contrôle.

    Je n'ai pas trouvé le moyen de faire ceci avec le TextBox. Existe-t-il un contrôle d'édition capable de faire cette opération?

    Merci.

    mardi 28 octobre 2008 08:45

Réponses

  • Bonjour,

     

    Il n'est pas possible de réaliser ceci avec un TextBox.

    Personnellement, pour ce genre d'affichage de log, j'utilise le contrôle ListView :

    • Avec le mode View = Details
    • Avec une colonne

    Chaque Item du ListView représente une ligne du fichier log. L'avantage, c'est que vous pouvez modifier les items 1 par 1...

     

    Cordialement

    jeudi 30 octobre 2008 17:55
  • Bonjour,

     

    Pourquoi lors de la mise à jour du libellé vous enlevez l'item 200 et le rajoutez à nouveau ? Essayez de changer le texte directement de l'item 200.

    Pour les ajouts "massif", afin d'éviter les clignotements, vous pouvez encadrer les ajouts par un BeginUpdate() et EndUpdate().

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    String mess;

    int nLine=1;

    listView1.BeginUpdate();

    for (int i = 0; i < 200; i++)

    {

    mess = String.Format("Ceci est le contenu de la ligne {0}\r\n", nLine);

    listView1.Items.Add(mess);

    }

    listView1.Items.Add("Ceci est le compteur: 0");

    listView1.EndUpdate();

    listView1.TopItem = listView1.Items[200];

    for (int i = 0; i < 100; i++)

    {

    for (int wait = 0; wait < 0x0000ffff; wait++)

    {

    Application.DoEvents();

    }

    mess = String.Format("Ceci est le compteur: {0}", i);

    listView1.Items[200].Text = mess;

    listView1.TopItem = listView1.Items[200];

    }

    }

     

     

    Cordialement

    jeudi 6 novembre 2008 10:45

Toutes les réponses

  • Bonjour,

     

    Pouvez-vous donnez un exemple de ce qui doit s'afficher successivement dans votre TextBox ?

     

    Cordialement

     

    mardi 28 octobre 2008 10:31
  • Merci pour votre réponse. Ci-dessous un exemple de sortie du programme où les points représentent un certain nombre de lignes contenant des infos sur le déroulement et xxxx représente un compteur permettant à l'utilisateur de suivre en direct le nombre de fichiers traités.

    Mon problème est que je ne vois pas comment placer ces compteurs sans redessiner tout le texte, mais uniquement en redessinant la valeur du compteur.

     

    Start.

    ....................................

    ....................................

    ....................................

    Traitement de l'année 2005.

    Nombre de fichiers à traiter : 652.

    Nombre de fichiers traités: xxx

    Traitement de l'année 2006.

    Nombre de fichiers à traiter : 1235.

    Nombre de fichiers traités : xxxx

    .......................................

    .......................................

    Nombre de fichiers traités : xxxx

    Traitement de l'année 2007.

    ......................................

    Et ainsi de suite........................

     

     

     

    mardi 28 octobre 2008 11:00
  • Bonjour,

     

    Il n'est pas possible de réaliser ceci avec un TextBox.

    Personnellement, pour ce genre d'affichage de log, j'utilise le contrôle ListView :

    • Avec le mode View = Details
    • Avec une colonne

    Chaque Item du ListView représente une ligne du fichier log. L'avantage, c'est que vous pouvez modifier les items 1 par 1...

     

    Cordialement

    jeudi 30 octobre 2008 17:55
  • Bonjour,

     

    Mon problème est en fait d'éviter le scintillement lors de la mise à jour du compteur.

    Le contrôle ListView, comme listBox d'ailleurs, ne permet pas d'éviter ce scintillement, car le contrôle est redessiné chaque fois que la valeur du compteur s'incrémente.

    Merci pour votre aide.

    Cordialement.

     

     

    vendredi 31 octobre 2008 18:42
  • Bonjour,

     

    Pouvez-vous nous montrer le code qui met à jour votre ListView ?

     

    Cordialement

     

    samedi 1 novembre 2008 12:43
  • Bonjour,

     

    Voici un petit exemple qui illustre le scintillement lorsque le compteur évolue.

    Pour faire fonctionner ce code, il faut créer un Form contenant un Listview et un Bouton.

    Cordialement.

     

    private void button1_Click(object sender, EventArgs e)

    {

    String mess;

    int nLine=1;

    for (int i = 0; i < 200; i++)

    {

    mess = String.Format("Ceci est le contenu de la ligne {0}\r\n", nLine);

    listView1.Items.Add(mess);

    }

    listView1.Items.Add("Ceci est le compteur: 0");

    listView1.TopItem = listView1.Items[200];

    for (int i = 0; i < 100; i++)

    {

    for (int wait = 0; wait < 0x0000ffff; wait++)

    {

    Application.DoEvents();

    }

    mess = String.Format("Ceci est le compteur: {0}", i);

    listView1.Items.RemoveAt(200);

    listView1.Items.Add(mess);

    listView1.TopItem = listView1.Items[200];

    }

    }

    jeudi 6 novembre 2008 09:10
  • Bonjour,

     

    Pourquoi lors de la mise à jour du libellé vous enlevez l'item 200 et le rajoutez à nouveau ? Essayez de changer le texte directement de l'item 200.

    Pour les ajouts "massif", afin d'éviter les clignotements, vous pouvez encadrer les ajouts par un BeginUpdate() et EndUpdate().

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    String mess;

    int nLine=1;

    listView1.BeginUpdate();

    for (int i = 0; i < 200; i++)

    {

    mess = String.Format("Ceci est le contenu de la ligne {0}\r\n", nLine);

    listView1.Items.Add(mess);

    }

    listView1.Items.Add("Ceci est le compteur: 0");

    listView1.EndUpdate();

    listView1.TopItem = listView1.Items[200];

    for (int i = 0; i < 100; i++)

    {

    for (int wait = 0; wait < 0x0000ffff; wait++)

    {

    Application.DoEvents();

    }

    mess = String.Format("Ceci est le compteur: {0}", i);

    listView1.Items[200].Text = mess;

    listView1.TopItem = listView1.Items[200];

    }

    }

     

     

    Cordialement

    jeudi 6 novembre 2008 10:45
  • Bonjour,

     

    Merci beaucoup pour votre aide.

    En effet, en changeant le texte directement dans l'item du compteur, le scintillement général disparaît lors de la mise à jour du compteur.

    Il semble quand même que je ne puisse pas l'éviter au niveau du rajout de lignes de texte avec la méthode Add, mais cela est moins gênant.

    Merci encore.

    Cordialement.

     

     

    vendredi 7 novembre 2008 05:39