TabPageCollection.RemoveByKey索引0超出范围

时间:2013-03-01 18:20:19

标签: c# .net winforms

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

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

要了解的一些关键事项:

  • 我可以通过chatTabs.TabPages.IndexOfKey(...)
  • 成功检索我要关闭的TabPage的索引
  • 我可以使用chatTabs.TabPages[...]
  • 中的索引值,通过IndexOfKey(...)成功检索TabPage对象本身
  • 当我尝试通过将值从chatTabs.TabPages[...]传递到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(...)

的调用

0 个答案:

没有答案