朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
.Net 複数の子フォームを表示中にオーナーフォームを触らせない





複数の子フォームを開いている間、親のフォームをいじらせたくない時があります。そんな時はフォームのEnabledをfalseにすれば触れません。
以下のサンプルコードではプロパティを使用してコントロールしています。

C#

オーナーフォームのコード

    public partial class Form1 : Form
    {
        //子フォームが表示されているかどうかを示すフラグ
        //それによって、親フォームになるこのフォームのEnabledを設定する。
        private bool _showingForm2 = false;
        private bool _showingForm3 = false;
        public bool ShowingForm2
        {
            get { return _showingForm2; }
            set
            {
                _showingForm2 = value;
                //子フォームが表示されているかどうかをチェック
                if (!_showingForm3 && !_showingForm2)
                {
                    //子フォームのいずれも表示されていなかったら、
                    //このフォームを有効にする
                    this.Enabled = true;
                }
                else
                {
                    //子フォームのいずれかが表示されていたら、
                    //このフォームを無効にする
                    this.Enabled = false;
                }
            }
        }
        public bool ShowingForm3
        {
            get { return _showingForm3; }
            set
            {
                _showingForm3 = value;
                //子フォームが表示されているかどうかをチェック
                if (!_showingForm3 && !_showingForm2)
                {
                    //子フォームのいずれも表示されていなかったら、
                    //このフォームを有効にする
                    this.Enabled = true;
                }
                else
                {
                    //子フォームのいずれかが表示されていたら、
                    //このフォームを無効にする
                    this.Enabled = false;
                }
            }
        }
        public string DataFromForm2
        {
            set
            {
                //子フォームのデータをコピーするための処理
                this.textBox1.Text = value;
            }
        }
        public string DataFromForm3
        {
            set
            {
                //子フォームのデータをコピーするための処理
                this.textBox2.Text = value;
            }
        }
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //子フォームを表示させる
            Form2 frm2 = new Form2();
            Form3 frm3 = new Form3();
            //子フォームのオーナーを設定する
            frm2.Owner = this;
            frm2.Show();
            frm3.Owner = this;
            frm3.Show();
        }
    }

子フォーム1のコード

    public partial class Form2 : Form
    {
        //オーナーフォーム用フィールド
        private Form1 _frm;
        public Form2()
        {
            InitializeComponent();
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            //オーナーフォームを取得
            _frm = this.Owner as Form1;
            //フォーム2が表示されていると設定
            _frm.ShowingForm2 = true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //オーナーフォームにデータをコピー
            _frm.DataFromForm2 = this.textBox1.Text;
            //フォーム2が非表示になると設定
            _frm.ShowingForm2 = false;
            this.Close();
        }
    }

子フォーム2のコード

    public partial class Form3 : Form
    {
        //オーナーフォーム用フィールド
        private Form1 _frm;
        public Form3()
        {
            InitializeComponent();
        }
        private void Form3_Load(object sender, EventArgs e)
        {
            //オーナーフォームを取得
            _frm = this.Owner as Form1;
            //フォーム3が表示されていると設定
            _frm.ShowingForm3 = true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //オーナーフォームにデータをコピー
            _frm.DataFromForm3 = this.textBox1.Text;
            //フォーム2が非表示になると設定
            _frm.ShowingForm3 = false;
            this.Close();
        }
    }

VB.NET

オーナーフォームのコード

Public Class Form1
    '子フォームが表示されているかどうかを示すフラグ
    'それによって、親フォームになるこのフォームのEnabledを設定する。
    Private _showingForm2 As Boolean = False
    Private _showingForm3 As Boolean = False
    Public Property ShowingForm2() As Boolean
        Get
            Return _showingForm2
        End Get
        Set(ByVal value As Boolean)
            _showingForm2 = value
            '子フォームが表示されているかどうかをチェック
            If _showingForm3 = False And _showingForm2 = False Then
                '子フォームのいずれも表示されていなかったら、
                'このフォームを有効にする
                Me.Enabled = True
            Else
                '子フォームのいずれかが表示されていたら、
                'このフォームを無効にする
                Me.Enabled = False
            End If
        End Set
    End Property
    Public Property ShowingForm3() As Boolean
        Get
            Return _showingForm3
        End Get
        Set(ByVal value As Boolean)
            _showingForm3 = value
            '子フォームが表示されているかどうかをチェック
            If _showingForm3 = False And _showingForm2 = False Then
                '子フォームのいずれも表示されていなかったら、
                'このフォームを有効にする
                Me.Enabled = True
            Else
                '子フォームのいずれかが表示されていたら、
                'このフォームを無効にする
                Me.Enabled = False
            End If
        End Set
    End Property
    Public WriteOnly Property DataFromForm2() As String
        Set(ByVal value As String)
            '子フォームのデータをコピーするための処理
            Me.TextBox1.Text = value
        End Set
    End Property
    Public WriteOnly Property DataFromForm3() As String
        Set(ByVal value As String)
            '子フォームのデータをコピーするための処理
            Me.TextBox2.Text = value
        End Set
    End Property
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '子フォームを表示させる
        Dim frm2 As Form2 = New Form2()
        Dim frm3 As Form3 = New Form3()
        '子フォームのオーナーを設定する
        frm2.Owner = Me
        frm2.Show()
        frm3.Owner = Me
        frm3.Show()
    End Sub
End Class

子フォーム1のコード

Public Class Form2
    'オーナーフォーム用フィールド
    Private _frm As Form1
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'オーナーフォームを取得
        _frm = CType(Me.Owner, Form1)
        'フォーム2が表示されていると設定
        _frm.ShowingForm2 = True
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'オーナーフォームにデータをコピー
        _frm.DataFromForm2 = Me.TextBox1.Text
        'フォーム2が非表示になると設定
        _frm.ShowingForm2 = False
        Me.Close()
    End Sub
End Class

子フォーム2のコード

Public Class Form3
    'オーナーフォーム用フィールド
    Private _frm As Form1
    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'オーナーフォームを取得
        _frm = CType(Me.Owner, Form1)
        'フォーム3が表示されていると設定
        _frm.ShowingForm3 = True
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'オーナーフォームにデータをコピー
        _frm.DataFromForm3 = Me.TextBox1.Text
        'フォーム2が非表示になると設定
        _frm.ShowingForm3 = False
        Me.Close()
    End Sub
End Class








良いやや良い普通やや悪い悪い

投稿日時評価コメント