4

C# (Visual Studio 2010) の .NET TabControl で奇妙な問題が発生しています。Windows フォーム アプリケーションを開始します。タブ コントロールとボタンを追加します。2 つのタブ ページに 2 つの異なるラベルを追加して、それらを区別できるようにします。ボタンの目的は、次のボタンとして機能することだけです。次のコードで Click イベントをサブスクライブします。

tabControl1.SelectTab(1);

ユーザーが最初のタブで何か間違ったことを入力したと仮定して、ユーザーが 2 番目のタブに移動しようとしたときにそれらを送り返したいので、次のコードでタブ コントロールの SelectedIndexChanged イベントをサブスクライブします。

if(tabControl1.SelectedIndex == 1)
{
    tabControl1.SelectTab(0);
}

プログラムを実行し、ボタンをクリックします。上部の強調表示されたタブから判断すると、最初のタブ ページが選択されているように見えるページであることがわかります。ただし、タブ コントロールの本体に実際に表示されるタブ ページから判断すると、表示されるのは 2 番目のタブ ページです。さまざまなコントロールの Focus()、Update()、および Refresh() 関数の呼び出しは役に立たないようです。ここで何が起こっているのですか?

4

1 に答える 1

6

私は再現します。これはイベント ハンドラーの一般的な問題です。フロア マットをそのように引っ張ることで、ネイティブ Windows コントロールの詰め込みを混乱させる可能性があります。TreeView は、この種の問題が発生しやすい別のコントロールです。

このような問題には、エレガントで一般的な解決策があります。 Control.BeginInvoke() を使用してコマンドを遅らせることができます。ネイティブ コントロールでイベントの生成が完了し、すべての副作用が完了したに実行されます。次のように、この問題も解決します。

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) {
        if (tabControl1.SelectedIndex == 1) {
            this.BeginInvoke(new Action(() => tabControl1.SelectTab(0)));
        }
    }
于 2012-06-16T01:08:20.840 に答える