3

C# Windows Formsアプリケーションを開発しています。すべてのフォームの単一のインスタンスが必要です。

したがって、ユーザーが連絡先ボタンを 2 回クリックすると、2 つの連絡先フォームではなく、1 つのインスタンスの連絡先フォームが前面に表示されます。

どうすればこれを達成できますか?

4

7 に答える 7

8

Application.OpenFormsを使用してフォームを作成および表示する前に、フォームが開いているフォームのコレクションに存在するかどうかを確認します。

if (System.Windows.Forms.Application.OpenForms["Form1"] as Form1 != null)
       MessageBox.Show("Form1 is opened");
 else
       MessageBox.Show("Form1 is not opened");
于 2012-10-19T05:51:54.700 に答える
3
public static Form GetOpenedForm<T>() where T: Form {
    foreach (Form openForm in Application.OpenForms) {
        if (openForm.GetType() == typeof(T)) {
            return openForm;
        }
    }
    return null;
}

そして、あなたのコードで、あなたは:を作成しContactFormます

ContactForm form = (ContactForm) GetOpenedForm<ContactForm>();
if (form == null) {
    form = new ContactForm();
    form.Show();
} else {
    form.Select();
}
于 2012-10-19T06:04:15.447 に答える
2

そのような単純な:

Form fc = Application.OpenForms["Form1"];
            if (fc != null)
            {
                fc.Focus();
            }
            else
            {
                Form1 f1 = new Form1();
                f1.Show();
            }
于 2012-10-19T06:02:55.430 に答える
2

contactButtonクリックすると無効になり、 contactForm-

private void contactButton_Click(object sender, EventArgs e)
{
  contactButton.Enabled=false;
  //code to open the contactForm
}

を閉じると、contactFormボタンを再度有効にすることができます。

contactButton.Enabled=true;
于 2012-10-19T06:32:44.013 に答える
1
Form2 form2 = null;
private void button1_Click(object sender, EventArgs e)
{
 bool isFormExists = false;
 foreach (Form openForm in Application.OpenForms)
 {
  if (openForm == form2 && openForm!=null)
  {
   openForm.Focus();
   isFormExists = true;
   break;
  }
 }

 if (!isFormExists)
 {
  form2 = new Form2();
  form2.Show();
 }
}
于 2012-10-19T06:10:40.990 に答える
1

このコンボを試してください

最初にコンタクトフォームをグローバルオブジェクトにする

private ContactForm contactForm;

次に、連絡先ボタン ハンドラ:

private void contactButton_Click(object sender, EventArgs e)
{
    if (contactForm == null)
    {
       contactForm = new ContactForm();
       contactForm.FormClosing += new FormClosingEventHandler(contactForm_FormClosing);
    }
    contactForm.Show();
}

次に、ContactForm の FormClosing イベントを処理して、閉じるのではなく非表示にします。

private void contactForm_FormClosing(object sender, FormClosingEventArgs e)
{
    contactForm.Hide();
    e.Cancel = true;
}

または、コンタクト フォームを閉じて、次回は新しいフォームとして開きたい場合は、代わりに FormClosed を処理します。

private void contactForm_FormClosed(object sender, FormClosedEventArgs e)
{
    contactForm = null;
}

次にボタンがクリックされると、null if 句がキャッチされ、フォームが新しいインスタンスに設定されて開かれます。

于 2012-10-19T06:00:24.153 に答える
1

私はオティエルの答えに行きます。また、フォームが最小化されている場合は表示されないため、WindowState を追加することもできます。この回答は、復元方法を取得するために使用できます。

ContactForm form = (ContactForm) GetOpenedForm<ContactForm>();
if (form == null) {
    form = new ContactForm();
    form.Show();
} else {
    //use this (if you want it to be restored to normal and focused)
    //no need of extension method
    //form.WindowState = FormWindowState.Normal;
    //form.Select();

    //or use this if you want it to be restored as previous state and focused
    //You need a Restore extension method that can be found in the link above
    form.Focus();
    form.Restore();
}
于 2014-02-04T19:12:13.797 に答える