1

私はMDIフォームを持っています。この MDI 内には、新しいフォームを開くための複数のボタンがあります。ボタンをbtn1btn2btn3btn4... とします。 を押すbtn1と、form1ロードされます。を押すbtn2と、form2ロードされます... 今、押すbtn1と、form1ロードされます。もう一度押すとbtn1、別のform1ものが開いています。同時に開いてみましょうform1、押すbtn2 form2と開いています。しかし、一度にフォームを開きたいです。どうすればこれを防ぐことができますか?

4

4 に答える 4

1

これは、Form1 を開いている間でも、Form2 と 3 などを開くことができるようにしたいということですか? それが望ましくない場合は、Show() の代わりに form1Instance.SHowDialog() を使用できます...しかし、それは通常、form1 が開いている間は親フォームにアクセスできないことを意味します...

しかし、King King の anwser の方が使いやすいかもしれません。

于 2013-07-25T06:05:34.997 に答える
1

あなたが得たすべての答えは良いので、それらを繰り返すつもりはありません。それを防ぐために使用できるメンバーとメソッドの例を挙げてください:

  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();
  }
于 2013-07-25T07:01:03.770 に答える
1

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--;
}
于 2013-07-25T05:20:53.773 に答える
1

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) が閉じたときにミューテックスが / 解放されていることを確認して、他のフォームを表示できるようにする必要があります。

于 2013-07-25T05:15:28.150 に答える