Formulaires

Résolu
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011 - 9 août 2010 à 01:27
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011 - 25 août 2010 à 23:00
Salut les pros.

La galère pour tout réapprendre un nouveau langage.

Bref. J'utilise ce petit bout de code pour ouvrir un formulaire, ma question est simple pour des pros comme vous.

private void hermesAdminToolStripMenuItem_Click(object sender, EventArgs e)
{
Frm_Params newMDIChild = new Frm_Params();
newMDIChild.MdiParent = this;
newMDIChild.Show();
}

Comment détecter si le formulaire en question est déjà ouvert ou iconisé?

Puis-je utiliser "newMDIChild" pour tous les formulaires que je dois ouvrir en déclarant celui-ci au sommet de ma classe en private ou alors je dois toutes les fois le redéclarer dans chaques boutons?
Ou alors tout simplement créer un nouveau

private void Ouverture formule (Form nom)
{
nom newMDIChild = new nom();
newMDIChild.MdiParent = this;
newMDIChild.Show();
}

(un truc dans le genre)

Un GRAND merci d'avance.......



Nicolas

12 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
9 août 2010 à 08:41
Bonjour

Chaque fois tu tu utilises un new tu crées une nouvelle form
si tu veux réutiliser l'ancienne alors déclare la au niveau de la classe, tu pourras alors savoir dans quelle état elle se trouve.

ex:

Form childForm = null;
private void ShowNewForm(object sender, EventArgs e)
{
if (childForm == null || !childForm.IsMdiChild)
{
childForm = new Form();
childForm.MdiParent = this;
childForm.Text = "Window " + childFormNumber++;
childForm.Show();
}
else
switch (childForm.WindowState)
{
case FormWindowState.Maximized:
case FormWindowState.Normal:
break;
case FormWindowState.Minimized:
childForm.WindowState = FormWindowState.Normal;
break;
}
}


Bob
C# is amazing, enjoy it!
3
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
10 août 2010 à 00:00
Super, merci, je vais déjà essayer ton bout de code.....

Je peux passer en paramètre le nom du formulaire? Histoire de garder le meme void pour tous les formulaires que je vais ouvrir... Ou alors, dans ma fenêtre principale, je dois déclarer à chaques fois un différent.

Form Chidlform1 =null;
Form Childform2=null;
Form Childform3=null;
......
....
...
..
.

Ou alors faire une boucle pour retrouver si il existe dans la collection??

Nicolas
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
10 août 2010 à 17:14
Bonjour

Oui tu peux passer le nom du formulaire en parametre, ou une référence sur celui-ci.

private void ShowNewForm(Form childForm )


tu peux également verifier dans ta collection si le formulaire exite, mais
attention si l'utilisateur a fermé un formulaire (croix rouge en haut et a droite) le formulaire existe toujours dans la collection, mais est n'est plus accessible d'ou le test !childForm.IsMdiChild
dans ce cas tu dois en créer un nouveau avec le même nom par exemple.

Bon code.
Bob
C# is amazing, enjoy it!
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
11 août 2010 à 20:40
Bonsoir

en fait tout dépend de ce que tu veux faire.

en passant un argument de type Form c'est un objet form que tu passes,
ti tu veux travailler avec son nom, passe plutot un type string

petit exemple:
je crée une méthode permettant de retrouver, et d'activer, un formulaire existant dans une collection, en se basant sur son nom.
/// <summary>
/// methode LookupInCollection
/// Recherche un formulaite par son nom dans une collection
/// la recherche n'est pas senssible à la casse
/// s'il est trouvé il sera réactivé
/// </summary>
/// la collection de formulaire


/// le nom du formulaireà recherché


/// <returns>le formulaire recherché, ou null si non trouvé</returns>
private Form LookupInCollection(Form[] forms, string formName)
{
//recherche du formulaire dans la collection de form
foreach (Form formFilleMdi in forms)
{
// comparaison sur le nom sans la casse
if (string.Compare(formFilleMdi.Name, formName, true) == 0)
{
// trouvé :-)
switch (formFilleMdi.WindowState)
{
case FormWindowState.Maximized:
case FormWindowState.Normal:
formFilleMdi.Focus(); // on lui redonne le focus
break;
case FormWindowState.Minimized:
formFilleMdi.WindowState = FormWindowState.Normal;
break;
}
return formFilleMdi;
}
}
//pas trouvé :-(
return null;
}


puis voici une façon d'utiliser cette methode
private void OpenForm(string formName, bool isMdi)
{
if (isMdi)
{
// recherche dans la collection des formulaires MDI
Form FormFille = LookupInCollection(this.MdiChildren, formName);
if (FormFille == null)
{
// pas trouvé , on en crée une nouvelle
FormFille = new Form();
FormFille.MdiParent = this; // type MDI
FormFille.Name = formName; // le nom pour la recherche
FormFille.Text = formName; // le titre
FormFille.Show();
return;
}
}
else
{
// recherche dans la collection des formulaires non MDI
Form FormFille = LookupInCollection(this.OwnedForms, formName);
if (FormFille == null)
{
// pas trouvé, on crée un nouveau formulaire non MDI
FormFille = new Form();
FormFille.Owner = this; // type non mdi
FormFille.Name = formName; // le nom pour la recherche
FormFille.Text = formName; // le titre
FormFille.Show();
return;
}
}
}


Sur mon formulaire principal j'ai 2 bouttons et un TextBox
Dans le TextBox on entre le numéro du formulaire
un click sur le boutton 1 ouvrira, ou réactivera, un formulaire MDI
un click sur le 2 ouvrira, ou réactivera, un formulaire non MDI

private void button1_Click(object sender, EventArgs e)
{
OpenForm(string.Format("Fomulaire mdi N°{0}",textBox1.Text), true);
}
private void button2_Click(object sender, EventArgs e)
{
OpenForm(string.Format("Fomulaire non mdi N°{0}",textBox1.Text), false);
} 


J'espere que cela va éclairer un peu ton chemin...

Bon code
Bob
C# is amazing, enjoy it!
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
14 août 2010 à 07:58
Bonjour Nicolas

En effet l'instruction "FormFille = new Form();" crée un formulaire vide.
si tu veux créer une instance d'un formulaire existant, par exemple de Form2, remplace new Form(); par new Form2();

Si tu as plusieurs modeles de formulaire, ex (Form2, Form3 ...) tu peux passer le type de formulaire en parametre à la methode OpenForm

1- remplace la signature de la methode OpenForm par:
// methode de création ou d'activation de formulaire
// doit être appelée en précisant le type de formulaire souhaité (pour la création)
private void OpenForm<T>(string formName, bool isMdi) where T:Form,new()

le where T: Form veut dire que la le type generique <T> sera de type Form,
et le new() que le type generique <T> peut être instancié

2-remplace les instructions "FormFille = new Form();" par
//on crée un formulaire suivant le type demandé
FormFille = new T();


3-Dans les appels de la methode ajoute le type de formulaire que tu désires

private void button1_Click(object sender, EventArgs e)
{
OpenForm<Form2>(string.Format("Fomulaire mdi N°{0}", textBox1.Text), true);
}
private void button2_Click(object sender, EventArgs e)
{
OpenForm<Form3>(string.Format("Fomulaire non mdi N°{0}", textBox1.Text), false);
}



C# is amazing, enjoy it!
3
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
10 août 2010 à 18:02
Super merci....



Nicolas
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
10 août 2010 à 20:53
Re salut.

Voici mon code :


Form FrmName = null;

private void OpenForm(Form Frm_Name,bool Mdi)
{
//Ouverture du formulaire passé en pparamètre
//Nom : Nom du formulaire à ouvrir
//Mdi : True fille mdi
if (Mdi == true)
{
if (FrmName == null || !FrmName.IsMdiChild)
{
FrmName = new Form();
FrmName.MdiParent = this;
//childForm.Text = "Window " + childFormNumber++;
FrmName.Show();
}
else
switch (FrmName.WindowState)
{
case FormWindowState.Maximized:
case FormWindowState.Normal:
break;
case FormWindowState.Minimized:
FrmName.WindowState = FormWindowState.Normal;
break;
}
}
else
{
//Ouverture formulaire non MDI
FrmName = new Form();
FrmName.Show();
}
}


Et, voici encore une question:

Sachant que le formulaire se nome "Frm_Params", comment l'écrire dans l'appel ci-dessous? (J'ai chaques fois une erreur de code)

Pour l'appel : OpenForm ("",True);



Je te rassure, je ne suis pas amnésique mais, en C#, je débute, je viens du VB et de Windev. En 2 mots, tout change mais, c'est tellement plus puissant.

Nicolas
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
14 août 2010 à 00:53
Un SUPER GRAND merci.... Je commence à comprendre de mieux en mieux et, je pense aussi comprendre pourquoi, le formulaire qui s'ouvre est sans les contrôles...


Le fait de passer "FormFille = new Form();" Me créé un formulaire vide sans rien. Ne me dis pas que je dois créer les contrôles par code?? (Je suis sur que tu a une solution aussi).




Nicolas
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
14 août 2010 à 17:00
Merci

Encore merci, merci.

Tu m'a vachement bien aidé et, cela va surement me servir dans énormément d'autres soucis.

A bientôt



Nicolas
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
25 août 2010 à 19:58
Salutations

Ton petit bout de code, m'a vachement bien aidé, j'en ai même profiter pour d'autres trucs...

Je me permet de te poser une petite question.

Ce qui est génial avec ton code c'est que je peux ouvrir plusieurs fois le meme formulaire mais, avec des noms différents donc, des actions différentes à l'ouverture... Par contre, comment exécuter un bout de code qui se trouve dans un des formulaires ouvert?


Code dans un des formulaires :

public void Affiche_table()
{
bla bla bal
}


A bientôt

Nicolas
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
25 août 2010 à 22:34
Bonsoir Nicolas

1- modifie la methode
private void OpenForm(string formName, bool isMdi)
pour qu'elle retourne le formulaire qu'elle vient d'ouvrir

public void OpenForm(string formName, bool isMdi)
et les return; en: return FormFille;

2-Dans le code appelant, tu pourras mémoriser le formulaire pour appeler ensuite ses méthodes
exemple, en supposant que la class du formulaire qui contient Affiche_table() est FormTable :
Form formulaire = OpenForm(string.Format("Fomulaire mdi N°{0}",textBox1.Text), true);
((FormTable)formulaire).Affiche_table();


le probleme c'est que tu dois connaitre le type du formulaire à l'avance, car je supose que tous tes formunlaire n'ont pas la méthodes Affiche_table()...

Si tu veux avoir une ou plusieurs méthodes public pour chaque formulaire tu peux définir une interface commune.
(demande-moi si tu as un probleme avec les interfaces).

Bob
C# is amazing, enjoy it!
0
cs_electro Messages postés 60 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 30 juin 2011
25 août 2010 à 23:00
Merci

En fait, je connais les formulaires qui ton la méthode.

De plus, cette méthode est utilisée pour réafficher les valeures de la table selon un traitement à un moment précis et, seulement si celui-ci est ouvert.

Tu vois ou je veux en venir?

J'essaye et, je te redis..

Nicolas
0
Rejoignez-nous