私はMDIフォームを持っています。この MDI 内には、新しいフォームを開くための複数のボタンがあります。ボタンをbtn1
、btn2
、btn3
、btn4
... とします。 を押すbtn1
と、form1
ロードされます。を押すbtn2
と、form2
ロードされます... 今、押すbtn1
と、form1
ロードされます。もう一度押すとbtn1
、別のform1
ものが開いています。同時に開いてみましょうform1
、押すbtn2
form2
と開いています。しかし、一度にフォームを開きたいです。どうすればこれを防ぐことができますか?
4 に答える
これは、Form1 を開いている間でも、Form2 と 3 などを開くことができるようにしたいということですか? それが望ましくない場合は、Show() の代わりに form1Instance.SHowDialog() を使用できます...しかし、それは通常、form1 が開いている間は親フォームにアクセスできないことを意味します...
しかし、King King の anwser の方が使いやすいかもしれません。
あなたが得たすべての答えは良いので、それらを繰り返すつもりはありません。それを防ぐために使用できるメンバーとメソッドの例を挙げてください:
private Form frm;
private void button1_Clicked(object sender, EventArgs e)
{
if (frm != null)
{
frm.Close();
frm.Dispose();
}
frm = new Form1();
frm.Show();
}
private void button2_Clicked(object sender, EventArgs e)
{
if (frm != null)
{
frm.Close();
frm.Dispose();
}
frm = new Form2();
frm.Show();
}
flag
次のように、この目的のためにいくつかを使用できます。
bool formOpened;
private void buttons_Click(object sender, EventArgs e){
if(!formOpened){
//Show your form
//..............
formOpened = true;
}
}
//This is the FormClosed event handler used for all your child forms
private void formsClosed(object sender, FormClosedEventArgs e){
formOpened = false;
}
少なくともこれは機能する簡単な解決策です。
int
一般に、次のように、開いているフォームをカウントする変数が必要です。
int openedForms = 0;
//suppose we allow maximum 3 forms opened at a time.
private void buttons_Click(object sender, EventArgs e){
if(openedForms < 3){
//Show your form
//..............
openedForms++;
}
}
private void formsClosed(object sender, FormClosedEventArgs e){
openedForms--;
}
mutual exclusion
http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspxについて読むことができます。
これは、1 つのもの (スレッド、プロセス、フォームなど) だけを持っていることを確認するための一般的なソリューションです。同時に何かの。アプリケーション間で使用することもできます。ここに例を示します: http://www.dotnetperls.com/mutex
フォームごとに 1 つずつ、複数のミューテックスを作成できます。または、あなたに合った組み合わせで、フォームのセット用に 1 つ。
シナリオ例:
- Form1 は X という名前のミューテックスを作成します
- Form2 is being loaded は、ミューテックス X が作成されているかどうかをチェックし、作成されている場合はそれ自体を閉じます。
もちろんDisposed
、作成者 (この例では Form1) が閉じたときにミューテックスが / 解放されていることを確認して、他のフォームを表示できるようにする必要があります。