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