C# TabPageCollection.RemoveByKey索引0超出范围
所以我有一个很奇怪的问题。我正在使用jabber框架开发一个聊天应用程序。我正在尝试从TabControl中删除TabPage(从聊天窗口中删除聊天选项卡)。每个选项卡页都由用户的JID字符串设置键(user@server.com). 每当我试图按TabPage键删除它时,我都会得到ArgumentOutOfRangeException。下面是我用于显式删除聊天选项卡的代码。我还有另一个函数,它监听表单本身的关闭事件,在允许表单关闭之前,只需从每个选项卡页中删除第一个(也是唯一一个)控件 奇怪的是,当聊天表单尚未关闭时,该代码工作正常。使用此功能可以显式删除每个聊天选项卡。当我在窗体关闭并重新打开(当前打开的聊天被重新添加到它们自己的选项卡中)之后删除选项卡时,就会出现问题 需要了解的一些关键事项:C# TabPageCollection.RemoveByKey索引0超出范围,c#,.net,winforms,C#,.net,Winforms,所以我有一个很奇怪的问题。我正在使用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(…)
的调用,您试图删除控件,但没有。