3

それぞれが複数のコントロールを含む複数の TabPages を持つ TabControl があります。ユーザーがボタンを使用してタブから移動したときに、そのタブのコントロールが正しく変更されたことを検証したいと考えています。具体的には、ラジオボタンが選択されていることを確認したい。

検証が失敗した場合 (つまり、CancelEventArgs を true に設定した場合)、UI は入力に応答しなくなります。コントロールは引き続きホバーとクリックに応答します (つまり、色が変わります) が、アクションは実行されません。他のタブに移動することも、「X」ボタンを使用してアプリを閉じることもできません。

errorProvider の追加、SelectTab 呼び出しの追加、タブとタブ上のコントロールの両方への Focus() 呼び出しの追加、および MessageBox の追加を試みました。MessageBox で [OK] をクリックできましたが、「ロックされた」UI に戻りました。現在のタブ (検証に失敗した) のコントロールに Focus() 呼び出しを追加すると、次のコントロールが選択されますが、UI はまだロックされています。

なぜこれが起こっているのか、それを回避する方法はありますか?

注: これは、タブのボタンを使用してタブを変更しようとした場合にのみ発生します。別のタブをクリックするだけでキャンセルが機能し、期待どおりにすべてのコントロールが使用可能な状態でタブに戻ります。

編集:私はついにこれを再訪する時間がありました。検証をキャンセルするチェックボックスを備えた単純な 2 つのタブ コントロールを作成しました。「ロック」を示すために、タブに他のコントロール (ラジオ ボタンとテキスト ボックス) をいくつか配置しましたが、背後にコードがないため、ここには含まれていません。このコードは、私が抱えている問題を示しています。チェックボックスをオンにしてボタン 1 をクリックすると、すべてのコントロールが応答しなくなります。コードは次のとおりです。ご要望に応じてプロジェクトファイルをご利用いただけます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TabEventTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex++;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex--;
        }

        private void tabPage2_Validating(object sender, CancelEventArgs e)
        {
            if (checkBox2.Checked)
            {
                e.Cancel = true;
            }
        }

        private void tabPage1_Validating(object sender, CancelEventArgs e)
        {
            if (checkBox1.Checked)
            {
                e.Cancel = true;
            }
        }
    }
}
4

2 に答える 2