Liens entre form et class, je sais c souvent demander, mais je ne comprend pas t [Résolu]

red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 00:07 - Dernière réponse : red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention
- 14 juin 2005 à 22:26
Bonjour voila mon probleme tout bete, et qui m empeche de poursuivre



J ai une form principal, j aimerais pouvoir acceder aux boutons ou certaine methode depuis une autre forme, ou classe



J ai essayer plein de chose poster ici, meme les tordus



j ai tenter sa



static frm_log MaForm = new frm_log();

[STAThread]

static void Main()

{



Application.Run(MaForm);





}



J ai tenter en mettan public a la place de static ... aucun changement



J en suis reduit a passer en paramettre au constructeur des immence structure ou je resume ce dont j ai besoin .........



J ai trouer plein de sujet sue cela sur le net... et les reponse finisse toujours en queue de poisson...



Personne n aurai une reponse clair et net sur comment lié les form entre elle?




En delphi et vb suffit de mettre le_nom_de_la_form.control_voulu
........ ici, en c# doit bien y avoir une methode equivalente.... suis
desesperer sa fait 3 jour que je cherche...
Afficher la suite 

16 réponses

Répondre au sujet
Troborg 65 Messages postés samedi 24 avril 2004Date d'inscription 1 août 2005 Dernière intervention - 14 juin 2005 à 01:30
+3
Utile
Houla !
Vouloir accéder directement à des boutons d'une forme depuis ailleurs...

Bon, déjà dans la form à laquelle tu veux accéder, plutôt que de passer les méthodes private en public,
il vaut sans doute mieux les redéfinir... Quitte à faire de bêtes :


public void Button1_Click()
{
button1_Click(null, null);
}

Ensuite, le problème est de retrouver la forme principale...
Ce que tu essaies de faire correspond à mon 3ème cas...
J'te mets les 2 autres solutions possibles pour infos !

Méthode 1 : cas des MDI
Si ta forme principale est une MDI (multiple document interface : il faut pour cela qu'elle ait la propriété "IsMdiContainer" à vrai), tu peux indiquer à ta 2ème forme que c'est son parent ("form2.MdiParent = this;"), tu pourras ensuite accéder à la forme principale depuis la 2nde forme en faisant par exemple : "(ParentForm as Form1 ).Button1_Click();"

Méthode 2 : cas courant
Bon, en fait je doute que tu utilises une MDI..
Dans ce cas tu peux tout simplement ajouter un attribut "myParent" dans ta forme 2...
Au moment de créer ta forme 2, tu pourras faire "form2.MyParent = this;",
l'appel se fera comme ci-dessus ! "(myParent as Form1).Button1_Click();"

Méthode 3 : retrouver la forme principale de n'importe où
Ce à quoi il faut faire attention dans ce cas, c'est que tu crées ta forme principale dans une autre classe, par convention la classe "Program".
Pour pouvoir y accéder, il faut donc mettre ta forme en static (pour pouvoir y accéder sans notion d'instance !) et en public (pour pouvoir y accéder !).
On obtient ainsi un truc de ce genre pour la classe Program :
static class Program
{
public static Form1 form1;

[STAThread]
static void Main()
{
form1 = new Form1();
Application.Run(form1);
}
}

Tu pourras maintenant accéder à ta forme principale depuis n'importe où; en appelant "Program.form1",
l'exemple précédent devient ainsi : "Program.form1.Button1_Click();"

J'avoue que cette dernière méthode me plait beaucoup moins...

Voila...
J'espère que ça t'aidera !!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Troborg
Troborg 65 Messages postés samedi 24 avril 2004Date d'inscription 1 août 2005 Dernière intervention - 14 juin 2005 à 21:16
+3
Utile
J'avais pas fait gaffe à la seconde question !

En fait C# ne permet pas de mettre du code en dehors des classes (contrairement à C++ qui a conservé ainsi une grande compatibilité avec le C classique....)

Le principe des langages objets est de travailler sur des objets...
C++ permet de faire quelques petites entorses cette règle du "tout objet"...
(Mais je pense qu'on peut en fait considérer que les fonctions qui sont développées en C++ en dehors des classes, sont en fait comme des fonctions static développées dans une classe qui engloberait le programme..)

Pour travailler proprement, il est important que tu sépares bien chacun de tes objets...
Concernant les parties du code que tu mettais avant dans d'autres fichiers, tu as deux possibilités :
- soit elles sont liées à des objets (déjà existants ou à définir), dans ce cas tu peux les intégrer dans les classes adéquates (mais bon, je pense que ce ne doit pas être le cas... sinon tu n'aurais sans doute pas poser la question !)
- soit tu peux créer une ou plusieurs librairies de fonctions sous formes de classes dans lesquelles tes fonctions seront static (puisque ne dépendant d'aucun objet... Donc ne nécessitant pas d'instances de la classe).

Si tu développes des librairies de fonctions avec le framework 2.0, tu peux mettre la propriété static directement à ta classe pour indiquer que tu ne créeras jamais aucune instance de celle-ci..

Exemple concret :
Tu peux te créer une librairie de fonctions de maths comme ça :

static class MaLibMath // <!> On ne peut pas mettre dire qu'une class est static sur framework 1.0...
{
static public int Min (int a, int b)
{
return (a < b ? a : b);
}

static public int Max (int a, int b)
{
return (a < b ? b : a);
}
}

Et tu pourras ensuite accéder aux fonctions en appelant "MaLibMath.Min" et "MaLibMath.Max"
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Troborg
Troborg 65 Messages postés samedi 24 avril 2004Date d'inscription 1 août 2005 Dernière intervention - 14 juin 2005 à 22:04
+3
Utile
On n'avait pas convenu que tu arrétais de regarder ces méthodes, pour faire une gestion par évènements ?

En fait pour la "méthode 2", tu dois obtenir quelquechose comme ça :

Dans la form qui souhaite référencer une autre form, tu ajoutes l'attribut "myParent" : (ou un autre nom..)
public class frm_user : Form
{
private Form myParent; // NB : ce nom n'est pas forcément adapté...
// car on peut référencer ce qu'on veut.. pas forcément le parent !
public Form MyParent
{
get { return myParent; }
set { myParent = value; }
}

// ... Suite de ton formulaire....
}

Il faut ensuite que tu remplisses myParent , dans ton cas ça donne :

using(frm_user f = new frm_user(BaseDonne))
{
f.myParent=this;
f.ShowDialog();
}

Pour finir, tu pourras utiliser la propriété que tu viens de créer...
Par exemple en appelant dans une méthode de frm_user :
(myParent as frm_log).Button1_Click();

Notes :
1. J'aurais pu affecter directement le type frm_log à l'attribut myParent, afin d'éviter le cast finale...
Mais si j'avais fait ça, je me serais interdit de référencer d'autres forms.. ce qui est dommage..

2. au moment de l'appel, je te conseille d'entourer ce que tu feras par un try...catch !

Voila !

PS : Concernant les efforts d'organisation nécessaires pour gérer tes classes et libs...
C'est une bonne habitude à prendre... Après ça deviendra un automatisme !
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Troborg
Troborg 65 Messages postés samedi 24 avril 2004Date d'inscription 1 août 2005 Dernière intervention - 14 juin 2005 à 02:04
0
Utile
En relisant ton message et ma réponse,
j'me disais que ma réponse est sans doute inutilement longue... lol...

Bon, pour la résumer :
1. ajoute "public" en plus de "static" devant ton "frm_log MaForm = new frm_log();"
2. pour appeler ta forme, utilises "Program.MaForm"

...
Commenter la réponse de Troborg
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 14 juin 2005 à 09:29
0
Utile
dans tous les cas, ce n'est pas conforme au modèle objet.
Il vaut mieux utiliser les évènements, voir : http://www.csharpfr.com/forum.v2.aspx?ID=484044

Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
</FO< body>
Commenter la réponse de sebmafate
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 12:03
0
Utile
Merci tout le monde, vos reponses , sont assez clair, je vais tenter
mais je pense que sa va marcher je vous tiens au courant, merci
Commenter la réponse de red_doudou
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 12:23
0
Utile
La troisieme methode est celle que je tenter d utiliser mais cela refuse toujours



Pour les deu premier, je ne trouve pas ou taper pour definir le parent



J ai beau essayer partout, je n ai jamai assez dans le menu deroualan a my parent ....



suis un peu perdu la



Comment et ou se declarer les parent?



svp , merci pour l aide
Commenter la réponse de red_doudou
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 12:43
0
Utile
Je retire, la methode 1 marche, la methode 2 je pense que je vai y arriver, puisque j ai trouver pour la1



La trois je laisse tomber pour l instant



Sinon question au passage, mais je crée peu etre un nouveau topic



En c++ mes classe n avait que des methodes, et je metter le code dans d autre fichier sources.



Ici je n arrive pas a faire autrement que mettre le code dans les classe... c affreu.....
Commenter la réponse de red_doudou
Troborg 65 Messages postés samedi 24 avril 2004Date d'inscription 1 août 2005 Dernière intervention - 14 juin 2005 à 14:04
0
Utile
Réflexion faite, c'est vrai que j'aurais sans doute dû éviter de poster les 3 solutions que j'ai mises..
Car ce ne sont pas des habitudes à prendre...


La bonne solution est bien celle de Seb...
Les MDI ne sont sans doute pas du tout adaptés à ton pb, et tant qu'à passer du temps sur ton projet pour obtenir ce que tu veux, autant regarder quelque chose de propre !
Commenter la réponse de Troborg
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 15:19
0
Utile
Merci ca tombe bien si methode 3 marche pas



Sinon pour mon deuxieme prob ?
Commenter la réponse de red_doudou
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 21:26
0
Utile
Merci énormement, cela apparement va demander pas mal d effort d organisation, mais cela sera surement surmontable



Merci pour toutes ses reponses de tres bonnes qualités
Commenter la réponse de red_doudou
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 21:33
0
Utile
Quoique j ai un soucie, la methode avec les mdi j y arrive, je fait sa dans la forme 1





using(frm_user f = new frm_user(BaseDonne))



{




f.MdiParent=this;



f.ShowDialog();




}



Pour sans les mdi, je tape tou le f.myparent, parcque il me le propose
pas la ... snif ....je trouve pas la proprieter pour la form .myparen
et surtout ou la mettre??



T aurai un petit exemple concret ? merci
Commenter la réponse de red_doudou
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 21:57
0
Utile
J ai trouver le probleme, ce n est pas MyParent la proprieter mes Parent et donc on obtionet sa pour la creation







frm_user f = new frm_user();



f = (frm_user)this.Parent;





f.ShowDialog();



et pour l utilisation on obtion sa



(Parent as frm_log).mescontroloumethode.....



Bonne journé a tous, désolé pour le derangement
Commenter la réponse de red_doudou
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 21:59
0
Utile
Rectification, le f.showdialog explose, mais le prob vient peut etre de chez moi



Une exception non gérée du type 'System.NullReferenceException' s'est produite dans BDaveFormEtMaj.exe



Informations supplémentaires : Object reference not set to an instance of an object.
Commenter la réponse de red_doudou
Troborg 65 Messages postés samedi 24 avril 2004Date d'inscription 1 août 2005 Dernière intervention - 14 juin 2005 à 22:17
0
Utile
Hum.... Le code suivant est pas très beau... :
frm_user f = new frm_user();
f = (frm_user)this.Parent;
f.ShowDialog();

En faisant ça tu as essayé de remplacer la forme "frm_user" que tu avais créé par le parent de ta forme courrante (this.Parent)..... Qui dans le cas de la forme principale est null... d'où le crash...
La propriété Parent que tu essaies d'utiliser ici n'est vraiment pas adapté à ce que tu veux faire......
Mais c'est un peu de ma faute... Je n'aurais pas du appeler ma propriété myParent...

Par mon "myParent", j'entendais la forme qui appelle !.. (Ce qui n'était pas un choix de nom très judicieux, vu qu'il servait à référencer une forme... Mais pas spécialement le parent....)
Alors que la propriété "Parent" que tu essaies d'utiliser ici fait référence au container parent....

Je crois que je t'ai un peu embrouillé.... désolé....
Commenter la réponse de Troborg
red_doudou 14 Messages postés lundi 13 juin 2005Date d'inscription 15 juin 2005 Dernière intervention - 14 juin 2005 à 22:26
0
Utile
Merci ca a l air d aller
Commenter la réponse de red_doudou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.