2

次のコード:

    private void tabControl_ControlRemoved(object sender, ControlEventArgs e)
    {
        MessageBox.Show(tabControl.TabCount.ToString());
    }

最後のタブを閉じた後、TabControl にコントロール (タブページ) がないことを教えてくれるはずです。しかし、代わりに 1 があると表示されます。

これは TabControl.ControlRemoved の予想される動作ですか、それとも何らかのバグですか?

4

2 に答える 2

2

これは単に実行順序の問題です。TabCount プロパティは、 ControlRemoved イベントが発生するまで更新されません。この種の問題は、イベントではかなり一般的です。

これを修正するには、イベントが発生してすべての処理が完了した後にコードを実行します。

    private void tabControl1_ControlRemoved(object sender, ControlEventArgs e) {
        this.BeginInvoke(new Action(() => {
            MessageBox.Show(tabControl1.TabCount.ToString());
        }));
    }
于 2013-08-26T22:30:41.253 に答える
1

イベントは、実際に削除されるControlRemoved前に発生/発生します。TabPageYourTabPageは実際にはイベントの後でのみ削除され、もちろんイベント ハンドラーControlRemovedの外部でも削除されます。ControlRemovedの内部では、ControlRemoved引き続き「削除済み」にアクセスできますTabPage。これを回避するには、代わりに次のコードを試すことができます。

private void tabControl_ControlRemoved(object sender, ControlEventArgs e)
{
    MessageBox.Show(tabControl.Controls.OfType<TabPage>().Count().ToString());        
}

つまり、TabPageはコレクションから削除されたばかりですControlsが、まだTabPagesコレクション内にあります。

于 2013-08-26T22:32:22.770 に答える