C# Windows Formsアプリケーションを開発しています。すべてのフォームの単一のインスタンスが必要です。
したがって、ユーザーが連絡先ボタンを 2 回クリックすると、2 つの連絡先フォームではなく、1 つのインスタンスの連絡先フォームが前面に表示されます。
どうすればこれを達成できますか?
C# Windows Formsアプリケーションを開発しています。すべてのフォームの単一のインスタンスが必要です。
したがって、ユーザーが連絡先ボタンを 2 回クリックすると、2 つの連絡先フォームではなく、1 つのインスタンスの連絡先フォームが前面に表示されます。
どうすればこれを達成できますか?
Application.OpenFormsを使用してフォームを作成および表示する前に、フォームが開いているフォームのコレクションに存在するかどうかを確認します。
if (System.Windows.Forms.Application.OpenForms["Form1"] as Form1 != null)
MessageBox.Show("Form1 is opened");
else
MessageBox.Show("Form1 is not opened");
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();
}
そのような単純な:
Form fc = Application.OpenForms["Form1"];
if (fc != null)
{
fc.Focus();
}
else
{
Form1 f1 = new Form1();
f1.Show();
}
contactButton
クリックすると無効になり、 contactForm
-
private void contactButton_Click(object sender, EventArgs e)
{
contactButton.Enabled=false;
//code to open the contactForm
}
を閉じると、contactForm
ボタンを再度有効にすることができます。
contactButton.Enabled=true;
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();
}
}
このコンボを試してください
最初にコンタクトフォームをグローバルオブジェクトにする
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 句がキャッチされ、フォームが新しいインスタンスに設定されて開かれます。
私はオティエルの答えに行きます。また、フォームが最小化されている場合は表示されないため、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();
}