3

Windowsフォーム(c#)では、ユーザーがボタンをクリックするとフォームが表示され、正常に機能しています。ユーザーにはフォームが表示されますが、ユーザーが同じボタンをもう一度クリックすると、同じフォームが再び開き、2つのフォームが表示されます。これを防ぐ方法はありますか、参考にしてください。ありがとうございます。これは私のコードです...

private void button1_Click(object sender, EventArgs e)
{
  Form2 obj = new Form2();
  obj.Show();
}
4

7 に答える 7

8

あなたはおそらく次のようなことをしているでしょう:

void button1_OnClick(object sender, EventArgs e) {
    var newForm = new MyForm();
    newForm.Show();
}

したがって、クリックされるたびにフォームの新しいインスタンスが表示されます。あなたはこのようなことをしたいです:

MyForm _form = new MyForm();

void button1_OnClick(object sender, EventArgs e) {
    _form.Show();
}

ここには、表示したいフォームのインスタンスが1つだけあり、それをShow()するだけです。

于 2012-10-08T04:05:41.953 に答える
2
foreach (Form form in Application.OpenForms)
{
    if (form.GetType() == typeof(MyFormType))
    {
        form.Activate();
        return;
    }
}

Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();

どちらが優れているかを比較する方法以上のものを試しました。

しかし、私はこの解決策が答えよりも優れているに違いないと思います。

于 2017-06-06T09:24:35.493 に答える
0

あなたは次のようなことを試すことができます

    private Form f;
    private void button2_Click(object sender, EventArgs e)
    {
        if (f == null)
        {
            f = new Form();
            f.Closed += f_Closed;
            f.Show();
        }
    }

    void f_Closed(object sender, EventArgs e)
    {
        f = null;
    }
于 2012-10-08T04:06:27.987 に答える
0

ボタンのクリックハンドラーで毎回フォームの新しいインスタンスを作成している可能性があります。

したがって、Formオブジェクトの作成を。の外に移動する必要がありますButton_Click

于 2012-10-08T04:08:58.127 に答える
0

実証済みのソリューションの良い例を次に示します。フォームがまだ開いていない場合は、フォームが開きます。すでに開いている場合は、フォアグラウンドに配置されます。

namespace MainProgram
{
    public partial class Form1 : Form
    {
        private Form formNew = new FormToShowSomething();

        private void button1_Click(object sender, EventArgs e)
        {
            formNew.Show();
            formNew.Activate();
        }
    }
}
于 2017-10-04T15:27:37.483 に答える
0

問題の最も簡単な解決策は、ShowコマンドをShowDialogに置き換えることです。これにより、フォームが2回表示されないようにする場合に問題が発生しなくなります。

Form2 obj = new Form2();
obj.ShowDialog();

コード:.ShowDialog();問題を解決するために私たちが現在探しているものです

于 2020-08-09T04:23:44.483 に答える
0

10年後、バンドのように:p私のために働くコードを共有することを考えました。フォームインスタンスが存在するかどうかを確認するだけです。また、私はShowDialogを好みません。なぜなら、ユーザーはそのフォームに「トラップ」されており、煩わしいと感じるからです。ユーザーは、たとえばオンラインフォームに入力するときに、フィールド情報をコピーして貼り付ける必要がある場合など、別のソースからの他の情報を確認したい場合があります。

private void button1_Click(object sender, EventArgs e)
{
 var obj = Application.OpenForms.OfType<Form2>().Select(t => t).FirstOrDefault();
 if (obj != null)
   {
      obj.BringToFront();
   }
 else
   {
      obj = new Form2();
      obj.Show();
   }
}
于 2022-02-21T09:32:05.840 に答える