だから私は本当に奇妙な問題を抱えています。jabber フレームワークを使用してチャット アプリケーションを開発しています。TabControl から TabPage を削除しようとしています (チャット ウィンドウからチャット タブを削除します)。各 TabPage は、ユーザーの JID (user@server.com) の文字列をキーとしています。TabPage をキーで削除しようとすると、ArgumentOutOfRangeException が発生します。以下は、チャットタブを明示的に削除するためのコードです。フォーム自体の終了イベントをリッスンする別の関数があります。これは、フォームを閉じる前に、各 TabPage から最初の (そして唯一の) コントロールを削除するだけです。
奇妙な点は、チャット フォームが閉じられていないときにこのコードが正常に機能することです。この関数を使用して、各チャット タブを明示的に削除できます。フォームを閉じて再度開いた後にタブを削除しようとすると、問題が発生します (現在開いているチャットが独自のタブに再度追加されます)。
知っておくべき重要事項:
- 閉じたいTabPageのインデックスを正常に取得できます
chatTabs.TabPages.IndexOfKey(...)
chatTabs.TabPages[...]
のインデックス値を使用して、TabPage オブジェクト自体を正常に取得できます。IndexOfKey(...)
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(...)