【问题标题】:Clearing a listbox清除列表框
【发布时间】:2014-02-21 14:07:35
【问题描述】:

我正在开发一个聊天程序。聊天有效。客户端的 GUI 有 1 个文本区域来显示所有聊天消息、1 个文本字段和 1 个按钮来发送消息和 1 个列表框,其中包含与服务器实际连接的所有客户端名称。 如果一个客户端连接到服务器,服务器会发送一个特定的代码,该代码在客户端调用“requestClientnamelist()”方法,该方法从服务器请求实际的客户端名称列表并将此列表放入他的列表框中。

这是我的问题: 在我用实际的客户端名称列表重新填充列表框之前,我想先清除这个列表框,所以我在这个列表框中没有任何两次名称。但是 listbox1.Clear() 方法不会清除任何东西!列表框的填充工作,但旧的客户端名称列表的清除不起作用...

这是我的代码(此代码从不同的线程(不是 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);
                        }

【问题讨论】:

  • 仅供参考:您可以致电Console.WriteLine(e),它会产生更详细的输出。
  • 为什么只捕获 ObjectDisposedException?
  • The.Clear() 应该可以工作,如果您看到双重名称,然后去寻找另一段填充您的列表框的代码。

标签: c# multithreading listbox


【解决方案1】:

是的...您将不得不调用/BeginInvoke 列表框操作:(

【讨论】:

  • 我已经在我的startpost中这样做了?!我很困惑,你有一点 code-sn-p 你到底是什么意思吗?
【解决方案2】:

我正在使用此委托函数从其他线程访问主 UI 控件。它是一个可以重用的委托函数!

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

因此,您可以尝试一下(委托清除列表框并添加列表框项),看看它是否解决了您的问题? (它应该适用于列表框,因为上述委托的参考页面“How can solve "Cross-thread operation not valid"?”也使用 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);
            }

【讨论】:

    【解决方案3】:

    我的 startpost 中的代码已经开始工作了。我的错误是我忘记清除client.clientnameList。 坦克,对不起!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多