1

だから私は本当に奇妙な問題を抱えています。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(...)

4

0 に答える 0