所以我有一个非常奇怪的问题。我正在使用jabber框架开发一个聊天应用程序。我正在尝试从TabControl中删除TabPage(从聊天窗口中删除聊天选项卡)。每个TabPage都由用户的JID(user@server.com)的字符串键入。每当我尝试通过其键删除TabPage时,我得到一个ArgumentOutOfRangeException。以下是我明确删除聊天标签的代码。我有另一个函数来监听表单本身的结束事件,它只是在允许表单关闭之前从每个TabPage中删除第一个(也是唯一的)控件。
奇怪的是,当聊天表单尚未关闭时,此代码可以正常工作。可以使用此功能显式删除每个聊天选项卡。当我关闭并重新打开表单后删除选项卡时会出现问题(在他们自己的选项卡中重新添加当前打开的聊天记录)。
要了解的一些关键事项:
chatTabs.TabPages.IndexOfKey(...)
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(...)