我正在做一个聊天程序。聊天程序可以使用。客户端的GUI有一个显示所有聊天信息的textarea,一个文本字段和一个发送信息的按钮,还有一个列表框,其中包含了所有与服务器实际连接的客户名称。如果有一个客户连接到服务器,服务器会发送一个特定的代码来调用客户端的 "requestClientnamelist() "方法,该方法会向服务器请求实际的客户名称列表,并将该列表放入他的列表框中。
我的问题是:在我用实际的clientnamelist重新填充列表框之前,我想先清除这个列表框,这样我就不会在这个列表框中出现任何两次的名字。但是listbox1.Clear()方法并没有清除任何东西! 但是listbox1.Clear()方法并没有清理任何东西!列表框的填充是有效的,但是清除旧的clientnamelist并不有效......。
这是我的代码(这段代码从另一个线程调用(不是GUI线程))。
// Clear and refill Clientnamelist in mainframe
try {
mainframe.Invoke((Action)delegate {
mainframe.listBox1.Items.Clear();
for (int i = 0; i < client.clientnameList.Count; i++) {
mainframe.listBox1.Items.Add(client.clientnameList[i]);
}
});
} catch (ObjectDisposedException e) {
Console.WriteLine(e.StackTrace);
}
是的......你将不得不调用列表框的动作:(
我使用这个委托函数从其他线程访问主界面控制。它是一个委托函数,可以是 重用!
private delegate void InvokeAction();
private void DoUI(InvokeAction call)
{
if (IsDisposed)
{
return;
}
if (InvokeRequired)
{
try
{
Invoke(call);
}
catch (InvalidOperationException)
{
//Alert?
}
}
else
{
call();
}
}
你可以这样调用DoUI
DoUI(() =>
{
mainframe.listBox1.Items.Clear();
});
因此,你可以试试这个(listbox上的委托清除和listbox项目添加),看看是否能解决你的问题?(在listbox上应该是可以的,因为上面委托的参考页面,"如何解决 "跨线程操作无效"?"也是以ListBox1为例(GvS的)。
try {
DoUI(() =>
{
mainframe.listBox1.Items.Clear();
});
for (int i = 0; i < client.clientnameList.Count; i++) {
DoUI(() =>
{
mainframe.listBox1.Items.Add(client.clientnameList[i]);
});
}
} catch (ObjectDisposedException e) {
Console.WriteLine(e.StackTrace);
}
我的startpost的代码已经在工作了。我的错误是我忘了清除client.clientnameList.Tanks,对不起!我的错误是我忘了清除client.clientnameList.Tanks。