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