C# TabPageCollection.RemoveByKey索引0超出范围

C# TabPageCollection.RemoveByKey索引0超出范围,c#,.net,winforms,C#,.net,Winforms,所以我有一个很奇怪的问题。我正在使用jabber框架开发一个聊天应用程序。我正在尝试从TabControl中删除TabPage(从聊天窗口中删除聊天选项卡)。每个选项卡页都由用户的JID字符串设置键(user@server.com). 每当我试图按TabPage键删除它时,我都会得到ArgumentOutOfRangeException。下面是我用于显式删除聊天选项卡的代码。我还有另一个函数,它监听表单本身的关闭事件,在允许表单关闭之前,只需从每个选项卡页中删除第一个(也是唯一一个)控件 奇怪

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

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

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

  • 我可以通过
    chattables.TabPages.IndexOfKey(…)
  • 使用
    IndexOfKey(…)
  • 当我试图通过将值从
    chattables.TabPages[…]
    传递到
    chattables.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);
    }
}
表单关闭侦听器/处理程序函数:

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:42963:错误[ChatForm]-索引0超出范围。
参数名称:索引
位于System.Windows.Forms.Control.ControlCollection.get_项(Int32索引)
位于System.Windows.Forms.TabControl.TabPageCollection.RemoveByKey(字符串键)
在c:\Work\[…]\ChatForm.cs中的.ChatForm.RemoveChat(JID userJID):第87行

其中第87行是对
RemoveByKey(…)

的调用,您试图删除
控件,但没有。