複数の子フォームを開いている間、親のフォームをいじらせたくない時があります。そんな時はフォームの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