随着时间的推移从listBox中删除项目 - C#;

时间:2017-04-05 08:27:44

标签: c# winforms listbox

我目前正在开发一个聊天程序,其目的是让它成为一个秘密程序(有点像Facebook有秘密聊天功能)。

我的消息被发送到listBox组件,我希望每隔10或者n秒,最旧的消息将被删除。一世 我试图用索引标记每条消息,但不太明白它是如何工作的。

我问的是,如果你们知道一个功能,或者可以帮我写一个能做到这一点的功能。我正在使用Visual Studio 2015 Windows Forms,C#。

3 个答案:

答案 0 :(得分:1)

好吧,当你有一个ListBox时,这些项都被编入索引,因为它是一个对象集合(一个对象数组)。从0开始,向上移动以获得更新的条目。

因此,我们假设我们在ListBox

中添加了3个项目
listBox1.Items.Add("Item 1"); //Index 0
listBox1.Items.Add("Item 2"); //Index 1
listBox1.Items.Add("Item 3"); //Index 2

您需要做的就是创建一个在后台运行的线程,每次删除索引0(最旧的条目)的项目。

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 :(得分:1)

在C#WinForms中,ListBox包含ListBoxItems,它是一个ObjectCollection(msdn-link

因此,您可以添加任何您喜欢的对象,将显示的消息来自DisplayMember

所以例如

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;
    }
}

可以添加为ListBoxItem。

将DisplayMember设置为"DisplayString"more here)将为您提供正确的输出。

现在您可以遍历ListBoxItems,将它们转换为MyMessage并检查它们的接收时间。

答案 2 :(得分:0)

我不知道你是否想过这个,但这是你可以实现这个任务的方法。

首先创建List strings

List<string> list1 = new List<string>();

要使用列表功能,您必须在表单

中包含集合
using System.Collections;

现在是棘手的部分。

首先在全局声明一个静态整数变量,即在所有类之外。

static int a;

每当您收到消息时(考虑到您的消息将采用字符串格式),您必须将该字符串添加到您创建的list1

list1.Add("the received message");    

现在你要申报一个计时器(如果你是新手,请查看计时器是如何工作的)。 Windows窗体已经有定时器,使用它会更好。 计时器在所需时间后发送Tick事件。

private void timer1_Tick(object sender, EventArgs e)
    {
         a = list1.Count() - 1;  //Count will return the number of items in the list, you subtract 1 because the indexes start from 0
         list1.RemoveAt(a);
         listBox.Items.Clear();
         foreach(string x in list1)
         {
              listBox.Items.Add(x);
         }
    }

此代码将执行的操作是,Tick event timer将刷新列表框,从数组中删除最后一个元素,然后用其余元素重新填充列表框。

要使用计时器,只需将其拖放到表单上即可。它基于GUI,易于弄清楚。

如果您有疑问,请告诉我。

提示:最大限度地利用try{}&amp; catch{}阻止应用程序崩溃。