所以我有一个非常奇怪的问题。我正在使用 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(...)