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

随着时间的推移从列表框中删除项目-C#;,c#,winforms,listbox,C#,Winforms,Listbox,我目前正在开发一个聊天程序,我的想法是让它成为一个秘密程序(有点像Facebook有秘密聊天功能) 我的消息被发送到一个列表框组件,我希望每隔10秒或“n”秒删除最旧的消息。我 他试图用索引标记每条消息,但不太明白它是如何工作的 我想问的是,你们是否知道一个函数,或者可以帮我写一个这样的函数。我使用的是Visual Studio 2015 Windows窗体,C#。当您有一个列表框时,所有项目都会被索引,因为它是一个对象集合(一个对象数组)。从0开始,向上搜索新条目 假设我们在列表框中添加了3项

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

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


我想问的是,你们是否知道一个函数,或者可以帮我写一个这样的函数。我使用的是Visual Studio 2015 Windows窗体,C#。

当您有一个
列表框时,所有项目都会被索引,因为它是一个对象集合(一个对象数组)。从0开始,向上搜索新条目

假设我们在
列表框中添加了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.

当你有一个
列表框时,所有的项目都被索引,因为它是一个对象集合(一个对象数组)。从0开始,向上搜索新条目

假设我们在
列表框中添加了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.
在C#WinForms中,ListBox包含ListBoxItems,它是ObjectCollection()

因此,您可以添加任何喜欢的对象,将显示的消息来自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”
()将获得正确的输出

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

在C#WinForms中,ListBox包含ListBoxItems,它是ObjectCollection()

因此,您可以添加任何喜欢的对象,将显示的消息来自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”
()将获得正确的输出


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

我不知道您是否考虑过这一点,但这里有一种方法可以完成此任务

首先创建
字符串的
列表

List<string> list1 = new List<string>();
现在是棘手的部分

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

static int a;
无论何时收到消息(考虑到您的消息将采用字符串格式),您都必须将该字符串添加到您创建的
list1

list1.Add("the received message");    
现在您必须声明一个计时器(如果您是新手,请查看计时器是如何工作的)。Windows窗体已经有计时器,最好使用它。 计时器在所需时间后发送一个勾号事件

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);
         }
    }
此代码将执行的操作是,在
计时器的每个
勾选事件
时,它将刷新列表框,从数组中删除最后一个元素,并用剩余的元素重新填充列表框

要使用计时器,只需将其拖放到窗体上。它都是基于GUI的,并且易于理解

如果你有疑问,请告诉我


提示:最大限度地利用
try{}
&
catch{}
块来避免应用程序崩溃。

我不知道您是否考虑过这一点,但这里有一种方法可以完成此任务

首先创建
字符串的
列表

List<string> list1 = new List<string>();
现在是棘手的部分

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

static int a;
无论何时收到消息(考虑到您的消息将采用字符串格式),您都必须将该字符串添加到您创建的
list1

list1.Add("the received message");    
现在您必须声明一个计时器(如果您是新手,请查看计时器是如何工作的)。Windows窗体已经有计时器,最好使用它。 计时器在所需时间后发送一个勾号事件

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);
         }
    }
此代码将执行的操作是,在
计时器的每个
勾选事件
时,它将刷新列表框,从数组中删除最后一个元素,并用剩余的元素重新填充列表框

要使用计时器,只需将其拖放到窗体上。它都是基于GUI的,并且易于理解

如果你有疑问,请告诉我


提示:最大限度地利用
try{}
catch{}
块来避免应用程序崩溃。

到目前为止,您尝试了什么?请提供一些代码,然后我们可以尝试并帮助您改进。请添加winform标记。到目前为止您尝试了什么?请提供一些代码,然后我们可以尝试帮助您改进。请添加winform标记。根据
列表框
中项目的顺序,您可能需要使用
列表框。项目。追加
插入
。与重新创建整个列表的foreach相比节省了一些时间。@MarkusDeibel它节省了时间,但这不是必需的。需要清除列表框,然后在没有最后一条消息的情况下重新填充。您是指其他内容吗?您能否从
Items
中删除最后一项,列表框将反映更改?是否确实必须重新填充项目列表以重新绘制?根据
列表框
中项目的顺序,您可能需要使用
列表框.items.Append
插入
。与重新创建整个列表的foreach相比节省了一些时间。@MarkusDeibel它节省了时间,但这不是必需的。需要清除列表框,然后在没有最后一条消息的情况下重新填充。您是指其他内容吗?您能否从
Items
中删除最后一项,列表框将反映更改?您真的需要重新填写项目列表以重新绘制吗?