清理列表框

问题描述 投票:0回答:3

我正在做一个聊天程序。聊天程序可以使用。客户端的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);
                        }
c# multithreading listbox
3个回答
0
投票

是的......你将不得不调用列表框的动作:(


0
投票

我使用这个委托函数从其他线程访问主界面控制。它是一个委托函数,可以是 重用!

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

0
投票

我的startpost的代码已经在工作了。我的错误是我忘了清除client.clientnameList.Tanks,对不起!我的错误是我忘了清除client.clientnameList.Tanks。

© www.soinside.com 2019 - 2024. All rights reserved.