Czy istnieje sposób zapobiegania otwieraniu określonego formularza w kontenerze MDI, jeśli ten formularz jest już otwarty?Zapobieganie zdublowaniu formularzy podrzędnych MDI
Odpowiedz
Można interate nad kolekcji OpenForms aby sprawdzić, czy jest już formą danego typu:
foreach (Form form in Application.OpenForms)
{
if (form.GetType() == typeof(MyFormType))
{
form.Activate();
return;
}
}
Form newForm = new MyFormType();
newForm.MdiParent = this;
newForm.Show();
AFAIK nie ma standardowy sposób. Musisz to zaimplementować samodzielnie. Zrobiłbym to w ten sposób:
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);
}
}
Jeżeli bezpieczeństwo wątku jest niepokoju, dodać odpowiednie lock
s.
bezpieczeństwo wątku nie powinno być problemem, ponieważ tylko kontroli dostępu GUI z jednego wątku . – Groo
mógłbyś dodać, że jest to implementacja wzorca singleton. Preferuję rozwiązanie Fredrika Mörka, nie narusza ono SOC –
ten kod działa
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();
}
Choć ten post jest bardzo stary, myślałem to doda pomoc.
Konieczność obsługi, jeśli formularz jest również zminimalizowany. Oto pełna przykład:
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();
Ta praca kod dla mnie w 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()
- 1. Zapobieganie temu samemu okienku podrzędnemu wiele razy w formularzu MDI
- 2. Zapobieganie wielokrotnym instancjom formularzy
- 3. Zapobieganie przesyłaniu podwójnych formularzy za pomocą tokenów
- 4. Zapobieganie automatycznym wypełnianiem pól formularzy przeglądarki
- 5. AngularJS: Zapobieganie sprawdzaniu ukrytych pól formularzy
- 6. Delphi, MDI kontra Tabs dla interfejsu wielu dokumentów
- 7. WPF MDI dzieci
- 8. Aplikacje MDI w WPF
- 9. zapobiegania podwójnemu wysłanych formularzy
- 10. Zdarzenie, gdy wszystkie formularze mdi są zamknięte
- 11. Przykład Delphi 2010/XE2 MDI - brakujący kod
- 12. Zapobieganie przesyłaniu formularzy za pomocą jquery ujs, jeśli pole jest puste
- 13. Zapobieganie przesyłaniu formularzy po kliknięciu przycisku Wyślij za pomocą przycisku anulowania
- 14. Znajdowanie WSZYSTKICH formantów podrzędnych WPF
- 15. Określanie szerokości wszystkich elementów podrzędnych:
- 16. Implementacja pól podrzędnych w PropertyGrid
- 17. Underscore.js _.where znajdowanie obiektów podrzędnych
- 18. Zapobieganie CSRF?
- 19. Zapobieganie ponownemu renderowaniu określonego komponentu potomnego
- 20. Zapobieganie wielokrotnym codziennym głosowaniom w konkursie
- 21. Zapobieganie zmianie jednego pola w modelu szyny
- 22. Wiele formularzy w widoku MVC: ModelState zastosowany do wszystkich formularzy
- 23. Zapobieganie kliknięciu wyzwalacza nadrzędnego wyzwalacza potomnego
- 24. Błąd zbierania formularzy
- 25. jQuery Wiele formularzy Prześlij
- 26. Wyłączanie zabezpieczeń formularzy CakePHP
- 27. Generator formularzy JavaScript
- 28. maszynopis do formularzy internetowych
- 29. rozłożenie między grupami formularzy
- 30. Najczystszy sposób resetowania formularzy
zamiast formy.Aktywnie() użyj formularza.WindowState = FormWindowState.Normal; w przeciwieństwie do pierwszego, ten drugi będzie działać, nawet jeśli to okno zostanie zminimalizowane. – docesam