0

WinFormsTabControlの選択解除イベントでタブの変更を処理しています。ただし、切り替える前にクリックしたタブを削除する場合があります。

シナリオ

タブ1とタブ2があります。現在タブ1にいます。タブ2をクリックします。タブ1イベントの選択を解除すると、タブコレクションからタブ2が削除されます。存在しないタブに移動しようとしているため、OnPaintでクラッシュします。(ArgumentOutOfRangeException)。選択イベントに到達する前にクラッシュします。

選択を解除したときにタブ数が変更されたかどうかを確認したくありません。これは、移動するタブが存在しなくなった場合にのみキャンセルしたいためです。

どんな助けでも大歓迎です。

    private void TabControl_Deselecting( object sender, TabControlCancelEventArgs ) {
       DoSomeWork();
    }

DoSomeWorkがクリックしたタブを削除するとします。移動しようとしていたタブが削除されたかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

1

再現なし。シナリオは奇妙ですが、クラッシュさせることはできません。必ず選択解除をキャンセルしてください。

    private void tabControl1_Deselecting(object sender, TabControlCancelEventArgs e) {
        if (e.TabPageIndex == 0 && tabControl1.TabCount > 1) {
            tabControl1.TabPages[1].Dispose();
            e.Cancel = true;
        }
    }
于 2012-04-03T20:50:56.327 に答える
0

私の頭に浮かぶ可能な解決策の1つ:

SelectイベントのTab1前にDeselectイベントが発生したことが確実な場合は、カスタムタブコントロールを宣言して、次の擬似コードのようにオーバーライドしようとします。Tab2OnPaintMethod

public class MyCustomTab : TabItem
{
   ...


   protected override OnPaint(....)
   {
      if(this.Parent == null) return;

       base.Paint(...);
   }    
}

TabControlそのタイプのTabItemを追加する必要があることを明確にします。

于 2012-04-03T20:29:55.247 に答える