Есть ли способ предотвратить открытие определенной формы в контейнере MDI, если эта форма уже открыта?Предотвращение дублирования дочерних форм MDI
ответ
Вы можете interate по коллекции OpenForms, чтобы проверить, есть ли уже форма данного типа:
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
AFAIK нет никакого стандартного способа. Вам придется реализовать его самостоятельно. Я хотел бы сделать это следующим образом:
class TheForm: Form
{
private static TheForm Instance;
private TheForm() // Constructor is private
{
}
public static Show(Form mdiParent)
{
if (Instance == null)
{
// Create new form, assign it to Instance
}
else
Instance.Activate(); // Not sure about this line, find the appropriate equivalent yourself.
}
protected override OnFormClose(EventArgs e)
{
Instance = null;
base.OnFormClose(e);
}
}
Если потокобезопасность вызывает беспокойство, добавьте соответствующие lock
с.
безопасность Тема не должна быть проблемой, поскольку вы получаете доступ только элементы управления GUI из одного потока , – Groo
, вы могли бы добавить, что это реализация одноэлементного шаблона. Я предпочитаю решение Fredrik Mörk, оно не нарушает SOC –
этот код работает
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(Form2))
{
form.Activate();
return;
}
}
Form2 newForm = new Form2();
newForm.MdiParent = this;
newForm.Show();
}
Хотя этот пост очень старый, я думал это добавит помощь.
Необходимо обработать, если форма также минимизирована. Вот полный пример:
foreach (Form form in this.MdiChildren)
{
if (form.GetType() == typeof(frmMain))
{
if (form.WindowState == FormWindowState.Minimized)
{
form.WindowState = FormWindowState.Normal;
}
form.Activate();
return;
}
}
Form frm = new frmMain();
frm.MdiParent = this;
frm.Show();
Этот код работа для меня в vb.net
For Each f As Form In Application.OpenForms If TypeOf f Is form_name Then f.Activate() f.WindowState = FormWindowState.Normal f.StartPosition = FormStartPosition.WindowsDefaultLocation f.WindowState = FormWindowState.Maximized
Return
End If
Next
form_name .MdiParent = Me
form_name .Show()
вместо формы.Activate() use form.WindowState = FormWindowState.Normal; в отличие от первого, последний будет работать, даже если это окно будет сведено к минимуму. – docesam