1

フォームがあり、以下のコードに記載されているのと同じフォームのインスタンスを取得したいと思います。そして、私にはボタンがあります。このボタンを押すたびに、新しいフォームが作成された場合はそのウィンドウにフォーカスし、そうでない場合は新しいフォームを作成します。

なんとか新しいフォームを作成できましたが、それに集中したいのであれば、コードが機能しませんでした。何かアイデアはありますか?

private void btn_Click(object sender, EventArgs e)
{
  if (opened == false)
  {
    Text = "form1";
    var form = new myformapp();
    form.Show();
    opened = true;
    form.Text = "form2";
  }
  else
  {
    if (Application.OpenForms[1].Focused)
    {
      Application.OpenForms[0].BringToFront();
      Application.OpenForms[0].Focus();
    }
    if (Application.OpenForms[0].Focused)
    {
      Application.OpenForms[1].BringToFront();
      Application.OpenForms[1].Focus();
    }
  }
}
4

2 に答える 2

1

私があなたがやろうとしていることを正しく理解していれば、開いたフォームで静的リストを保持することができます。フォームのインスタンスを開くたびにリストに追加し、閉じるたびに削除します。ボタンを押すと、リストのサイズを確認できます。1の場合は、新しいフォームを作成し、それを開いてフォーカスを設定します。サイズがすでに2の場合は、リストでクリックイベントを実行しているインスタンスとは異なるインスタンスを探します。コードは次のようになります。

    private static List<Form1> openForms = new List<Form1>();

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 frm = null;
        if (openForms.Count == 2)
        {
            foreach (Form1 aForm in openForms)
                if (aForm != this)
                {
                    frm = aForm;
                    break;
                }
        }
        else
        {
            frm = new Form1();
            frm.Show();
        }
        frm.Focus();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        openForms.Add(this);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        openForms.Remove(this);
    }
于 2012-09-10T14:30:07.637 に答える
1

この例では、変数を追加することなく、コードを短縮してみることができます。

void button1_Click(object sender, EventArgs e) {
  bool found = false;
  for (int i = 0; i < Application.OpenForms.Count; ++i) {
    if (Application.OpenForms[i].GetType() == typeof(myformapp) &&
        Application.OpenForms[i] != this) {
      Application.OpenForms[i].Select();
      found = true;
    }
  }

  if (!found) {
    myformapp form = new myformapp();
    form.Show();
  }
}

FrancescoBaruchelliのコメントからコードを更新しました。

于 2012-09-10T15:41:46.237 に答える