Home Page Home Page Tips & Tricks Come recuperare le Form MDI Child aperte

Come recuperare le Form MDI Child aperte


In un programma a finestre multiple Mdi, una di esse è contenitore delle altre impostando la propietà IsMdiContainer = true.
Quando si caricano le relative child (IsMdiChild = true) esse appaiono nella porzione messa a disposizione dalla principale, la quale ne gestisce alcune propietà come ad esempio la massimizzazione.
Ma come fa la MdiContainer a sapere quali sono le relative Form? E soprattutto a volte potrebbe essere utile avere da codice questa informazione.
Il Framework ci viene incontro fornendo l'insieme Controls dove per queste form il tipo è "Mdiclient" cosi ciclando sui controlli quelli child si possono individuare facilmente.
Una funzione ad esempio che le chiude tutte puo essere la seguente:

VB.NET
Codice .NET n°1
    Public Function FormsChiudiTutte(ByVal pFormMdi As Form)
For Each zCtrl As Control In pFormMdi.Controls
Select Case zCtrl.GetType().Name.ToLower()
Case "mdiclient"
While (zCtrl.Controls.Count > 0)
Dim zFrm As Form = zCtrl.Controls(0)
zFrm.Close()
zFrm = Nothing
End While
End Select
Next
End Function


C#
Codice .NET n°2
    public void FormsChiudiTutte(Form pFormMdi)
{
foreach(Control zCtrl in pFormMdi.Controls)
{
switch (zCtrl.GetType().Name.ToLower())
{
case "mdiclient":
MdiClient zMdiCli = (MdiClient)zCtrl;
while (zMdiCli.Controls.Count > 0)
zMdiCli.Controls[0].Dispose();
break;
}
}
}


Questo è un esempio banale ma naturalmente potete estenderlo secondo le vostre esigenze. E' possibile recuperare altre proprietà e impostazioni delle Form per esempio il nome e decidere di conseguenza che cosa fare, riprendendo l'esempio è possibile chiudere tutte le finestre tranne una, magari la principale, oppure disabilitare alcuni controlli all'interno di alcune Form oppure ancora durante l'apertura di una nuova finestra Child si può verificare se un'istanza è già stata creata o meno. In caso negativo potete instanziarla, in caso positivo è sufficiente portare in primo piano (impostare il Focus) l'istanza già attiva. La funzione che ci consente tale operazione è la seguente:

C#
Codice .NET n°3
		private Control FormsTrovaChild(Form pFormMdi,string pNomeForm)
{
pNomeForm = pNomeForm.ToLower();
foreach(Control zCtrl in pFormMdi.MdiChildren)
if (zCtrl.Name.ToLower() == pNomeForm)
{
zCtrl.Focus();
return zCtrl;
}

return null;
}


Una volta implementata, a livello di codice saranno sufficienti solo due istruzioni:

Codice .NET n°4
if (FormsTrovaChild(this,"clientiFrm") == null)
zFrm = new clientiFrm();
Copyright © dotNetHell.it 2002-2022
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5