OVH Cloud OVH Cloud

Atteindre un contrôle de Form depuis un autre Form

5 réponses
Avatar
thierry
- CAS A- depuis un Form enfant atteindre un contr=F4le du=20
Form Parent, par exemple, rendre invisible le=20
controle "ctrl".
Voici comment je proc=E8de :
1- dans frmParent, juste avant d'afficher frmEnfant, je=20
positionne le contr=F4le =E0 la fin de la collection Controls=20
de frmParent "ctrl.SendToBack();" pour =EAtre sur de=20
conna=EEtre son index (car sa place peut varier)
2- dans frmEnfant :=20
"ParentForm.Controls[(ParentForm.Controls.Count)-
1].visible=3Dfalse"
CONCLUSION : ce n'est pas du tout pratique et c'est risqu=E9=20
car le contr=F4le peut avoir chang=E9 de place dans Controls=20
entre 1 et 2

-CAS 2- Comment proc=E9der quand il s'agit de formulaires=20
qui n'ont pas de lien de parent=E9 ?

Merci de m'aider pour ces 2 cas...

5 réponses

Avatar
LEBRUN Thomas
Passe ta forme principale au constructeur de la 2mé form.

Ex:

frm1 avec 1 bouton:

public Button bt1 = new Button();

//Là, tu appelles une 2ème Form
// Et tu passe au constructeur l'instance de ta form en cours
Form frm2 = new Form(this);
frm2.Show();

Dans frm2, tu as le constructeur:

public Form(Form toto)
{
// Commme ton bouton est en public, tu peux faire
toto.Enabled = false;
}


Tu vois ce que je veux dire ou non ?

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com


"thierry" wrote:

- CAS A- depuis un Form enfant atteindre un contrôle du
Form Parent, par exemple, rendre invisible le
controle "ctrl".
Voici comment je procède :
1- dans frmParent, juste avant d'afficher frmEnfant, je
positionne le contrôle à la fin de la collection Controls
de frmParent "ctrl.SendToBack();" pour être sur de
connaître son index (car sa place peut varier)
2- dans frmEnfant :
"ParentForm.Controls[(ParentForm.Controls.Count)-
1].visibleúlse"
CONCLUSION : ce n'est pas du tout pratique et c'est risqué
car le contrôle peut avoir changé de place dans Controls
entre 1 et 2

-CAS 2- Comment procéder quand il s'agit de formulaires
qui n'ont pas de lien de parenté ?

Merci de m'aider pour ces 2 cas...



Avatar
LEBRUN Thomas
sur mon post d'avant, c'est

public Form(Form toto)
{
toto.bt1.Enabled = false;
}

pour désactiver le bouton de la 1ere form depuis la 2ème par ex.

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com


"thierry" wrote:

- CAS A- depuis un Form enfant atteindre un contrôle du
Form Parent, par exemple, rendre invisible le
controle "ctrl".
Voici comment je procède :
1- dans frmParent, juste avant d'afficher frmEnfant, je
positionne le contrôle à la fin de la collection Controls
de frmParent "ctrl.SendToBack();" pour être sur de
connaître son index (car sa place peut varier)
2- dans frmEnfant :
"ParentForm.Controls[(ParentForm.Controls.Count)-
1].visibleúlse"
CONCLUSION : ce n'est pas du tout pratique et c'est risqué
car le contrôle peut avoir changé de place dans Controls
entre 1 et 2

-CAS 2- Comment procéder quand il s'agit de formulaires
qui n'ont pas de lien de parenté ?

Merci de m'aider pour ces 2 cas...



Avatar
thierry
Bonjour,
Un grand merci pour ta réponse.
Mais est-ce une bonne pratique que de faire ce qui suit
pour rendre le Form1 accessible de n'importe quelle
méthode du Form2 via la référence frmOrigine ?

--- Dans Form2 :
private Form1 frmOrigine ;

public Form2(Form1 f)
{
frmOrigine=f ;
}

Merci

-----Message d'origine-----
Passe ta forme principale au constructeur de la 2mé form.

Ex:

frm1 avec 1 bouton:

public Button bt1 = new Button();

//Là , tu appelles une 2ème Form
// Et tu passe au constructeur l'instance de ta form en


cours
Form frm2 = new Form(this);
frm2.Show();

Dans frm2, tu as le constructeur:

public Form(Form toto)
{
// Commme ton bouton est en public, tu peux faire
toto.Enabled = false;
}


Tu vois ce que je veux dire ou non ?

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com


"thierry" wrote:

- CAS A- depuis un Form enfant atteindre un contrôle




du
Form Parent, par exemple, rendre invisible le
controle "ctrl".
Voici comment je procède :
1- dans frmParent, juste avant d'afficher frmEnfant, je
positionne le contrôle à la fin de la collection




Controls
de frmParent "ctrl.SendToBack();" pour être sur de
connaître son index (car sa place peut varier)
2- dans frmEnfant :
"ParentForm.Controls[(ParentForm.Controls.Count)-
1].visibleúlse"
CONCLUSION : ce n'est pas du tout pratique et c'est




risqué
car le contrôle peut avoir changé de place dans




Controls
entre 1 et 2

-CAS 2- Comment procéder quand il s'agit de




formulaires
qui n'ont pas de lien de parenté ?

Merci de m'aider pour ces 2 cas...



.



Avatar
LEBRUN Thomas
Je sais que cela se fait, oui.

Maintenant, de là à te dire si oui ou non, c'est une bonne pratique, je ne
saurais le faire.

Un conseil, essaye de passer un coup de FxCop
(http://www.gotdotnet.com/team/fxcop/) sur ton EXE pour voir si l'on te fait
une "remarque" sur cette méthode.

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com

"thierry" wrote:

Bonjour,
Un grand merci pour ta réponse.
Mais est-ce une bonne pratique que de faire ce qui suit
pour rendre le Form1 accessible de n'importe quelle
méthode du Form2 via la référence frmOrigine ?

--- Dans Form2 :
private Form1 frmOrigine ;

public Form2(Form1 f)
{
frmOrigine=f ;
}

Merci

>-----Message d'origine-----
>Passe ta forme principale au constructeur de la 2mé form.
>
>Ex:
>
>frm1 avec 1 bouton:
>
>public Button bt1 = new Button();
>
>//Là , tu appelles une 2ème Form
>// Et tu passe au constructeur l'instance de ta form en
cours
>Form frm2 = new Form(this);
>frm2.Show();
>
>Dans frm2, tu as le constructeur:
>
>public Form(Form toto)
>{
> // Commme ton bouton est en public, tu peux faire
> toto.Enabled = false;
>}
>
>
>Tu vois ce que je veux dire ou non ?
>
>A+
>
>-------------------
>LEBRUN Thomas
>http://morpheus.developpez.com
>
>
>"thierry" wrote:
>
>> - CAS A- depuis un Form enfant atteindre un contrôle
du
>> Form Parent, par exemple, rendre invisible le
>> controle "ctrl".
>> Voici comment je procède :
>> 1- dans frmParent, juste avant d'afficher frmEnfant, je
>> positionne le contrôle à la fin de la collection
Controls
>> de frmParent "ctrl.SendToBack();" pour être sur de
>> connaître son index (car sa place peut varier)
>> 2- dans frmEnfant :
>> "ParentForm.Controls[(ParentForm.Controls.Count)-
>> 1].visibleúlse"
>> CONCLUSION : ce n'est pas du tout pratique et c'est
risqué
>> car le contrôle peut avoir changé de place dans
Controls
>> entre 1 et 2
>>
>> -CAS 2- Comment procéder quand il s'agit de
formulaires
>> qui n'ont pas de lien de parenté ?
>>
>> Merci de m'aider pour ces 2 cas...
>>
>.
>



Avatar
Zazar
Bonjour,

Mais est-ce une bonne pratique que de faire ce qui suit
pour rendre le Form1 accessible de n'importe quelle
méthode du Form2 via la référence frmOrigine ?



Dans le cas qui vous concerne, non.
1) Il faut éviter de déclarer des variables publiques , déclarez les
internes et utilisez les accesseurs.
2) Ensuite, ne passez pas une variable de type Form1, mais une interface
adaptée que Form1 implémentera.
En gros, un truc du style :

public Interface IHideableControlOwner {
control ControlToHide {
get;
}
}

public Form1:System.windows.Forms.Form, IHideableControlOwner {

private Button buttonOk;
public control IHideableControlOwner.ControlToHide {
get {
return buttonOk;
}
}
}

Ainsi, vous pourrez réutiliser le code manipulant les IHideableControlOwner
sur une autre feuille, et si jamais vous faîtes des modifications sur votre
feuille, vous n'aurez pas à les répercuter ailleurs.

--
Zazar