1

所以我有一个非常奇怪的问题。我正在使用 jabber 框架开发一个聊天应用程序。我正在尝试从 TabControl 中删除 TabPage(从聊天窗口中删除聊天选项卡)。每个 TabPage 都由用户的 JID (user@server.com) 字符串作为键。每当我尝试按其键删除 TabPage 时,都会收到 ArgumentOutOfRangeException。下面是我用于显式删除聊天选项卡的代码。我有另一个函数来监听表单本身的关闭事件,它只是在允许表单关闭之前从每个 TabPage 中删除第一个(也是唯一一个)控件。

奇怪的是,当聊天表单没有关闭时,这段代码可以正常工作。可以使用此功能明确删除每个聊天选项卡。当我在表单关闭并重新打开(当前打开的聊天被重新添加到它们自己的选项卡中)之后删除选项卡时,就会出现问题。

需要了解的一些关键事项:

  • 我可以成功检索到要关闭的 TabPage 的索引chatTabs.TabPages.IndexOfKey(...)
  • chatTabs.TabPages[...]我可以通过使用索引值成功检索 TabPage 对象本身IndexOfKey(...)
  • 当我尝试通过将值从chatTabs.TabPages[...]into传递来删除页面chatTabs.TabPages.Remove(...)时,没有任何反应
  • 当我尝试关闭catch块中的表单时,没有任何反应,并且表单保持打开状态

显然这是一个非常奇怪的问题,我已经没有办法调试它了。有什么想法吗?

RemoveChat(...)功能:

private void RemoveChat(JID userJID)
{
    if (chatTabs.TabPages.ContainsKey(userJID.Bare))
    {
        try
        {
            // remove the chat tab
            if (chatTabs.TabPages[userJID.Bare].Controls.Count > 0)
            {
                chatTabs.TabPages[userJID.Bare].Controls.RemoveAt(0);
            }
            chatTabs.TabPages.RemoveByKey(userJID.Bare);
        }
        catch (Exception ex)
        {
            log.Error(ex.Message + "\r\n" + ex.StackTrace);
            this.Close(); return;
        }

        // select the first available chat tab
        if (chatTabs.TabCount > 0)
        {
            chatTabs.SelectedIndex = 0;
        }
        // close the chat window
        else
        {
            this.Close();
        }
    }
}

表单关闭监听器/处理函数:

private void ChatForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // remove each chat control so they do not get disposed
    foreach (TabPage tab in chatTabs.TabPages)
    {
        tab.Controls.RemoveAt(0);
    }
}

我得到的错误RemoveByKey(...)

2013-03-01 12:39:42,963: ERROR <10> [ChatForm] - Index 0 is out of range.
Parameter name: index
   at System.Windows.Forms.Control.ControlCollection.get_Item(Int32 index)
   at System.Windows.Forms.TabControl.TabPageCollection.RemoveByKey(String key)
   at <...>.ChatForm.RemoveChat(JID userJID) in c:\Work\[...]\ChatForm.cs:line 87

其中第 87 行是调用RemoveByKey(...)

4

0 回答 0