Je travaille actuellement sur un programme de chat et l'idée est d'en faire un secret (un peu comme Facebook a la fonction de chat secret).

Mes messages sont envoyés à un composant listBox et je souhaite que toutes les 10 ou 'n' secondes, le message le plus ancien soit supprimé. je essayait de marquer chaque message avec un index mais ne comprenait pas très bien comment cela fonctionne.

Ce que je demande si vous connaissez peut-être une fonction ou pourriez-vous m'aider à en écrire une qui fait exactement cela. J'utilise Visual Studio 2015 Windows Forms, C #.

0
Balys Morkunas 5 avril 2017 à 11:27

2 réponses

Meilleure réponse

Eh bien, lorsque vous avez un ListBox, les éléments sont tous indexés puisqu'il s'agit d'une collection d'objets (un tableau d'objets). À partir de 0 et à la hausse pour les nouvelles entrées.

Disons que nous ajoutons 3 éléments à notre ListBox

listBox1.Items.Add("Item 1"); //Index 0
listBox1.Items.Add("Item 2"); //Index 1
listBox1.Items.Add("Item 3"); //Index 2

Tout ce que vous auriez à faire, c'est de créer un thread qui s'exécute en arrière-plan qui supprime l'élément à l'index 0 (l'entrée la plus ancienne) à chaque fois.

new Thread(() =>
{
   while(true)
   {
       if(listBox1.Items.Count > 0) //Can't remove any items if we don't have any.
       {
           Invoke(new MethodInvoker(() => listBox1.Items.RemoveAt(0))); //Remove item at index 0.
           //Needs invoking since we're accessing 'listBox1' from a separate thread.
       }
       Thread.Sleep(10000); //Wait 10 seconds.
   } 
}).Start(); //Spawn our thread that runs in the background.
1
ThePerplexedOne 5 avril 2017 à 08:43

Dans C # WinForms, un ListBox contient ListBoxItems qui sont un ObjectCollection (lien msdn)

Ainsi vous pouvez ajouter n'importe quel objet que vous aimez, le message qui sera affiché vient du DisplayMember

Donc par exemple

public class MyMessage {
    public DateTime Received { get; set; }
    public string Message { get; set; }
    public string DisplayString 
    {
        get { return this.ToString(); }
    }
    public string ToString() {
        return "[" + Received.ToShortTimeString() + "] " + Message;
    }
}

Peut être ajouté en tant que ListBoxItem.

Définition du DisplayMember sur "DisplayString" (plus ici) vous obtiendra la sortie correcte.

Maintenant vous pouvez parcourir les ListBoxItems, les convertir en MyMessage et vérifier l'heure à laquelle ils ont été reçus.

1
Community 23 mai 2017 à 10:30