Instancier form1 dans form2

Signaler
Messages postés
42
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
31 mai 2009
-
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
-
Bonjour à tous,
Ptite question bete surement,
 Comment instancier ma form1 (parent) dans form2 (fils) ?
J'ai ecris ceci mais le compilateur me dis qu'il ne connais pas mes textBox du form1 !!!!

namespace

testscrollbar{

public
partial
class
Form2 :
Form{

public
Form1 form1;

public Form2(){

InitializeComponent();

}

private
void Form2_Move(
object sender,
EventArgs e){

int cx =
this.Location.X;
int cy this.Location.Y;form1.textBox2.Text cx.ToString();

form1.textBox1.Text = cy.ToString();
cy this.Location.Y;cx

this.Location.X;}

}

}
D'avance merci        kiki.

16 réponses

Messages postés
149
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
30 janvier 2009

bah oui form1 est null là faut peut être lui passer en argument...




soit comme ca 

private
Form1 _form1;

public 
Form2(Form1 
aForm1)
{
  _form1= aForm1;
  InitializeComponent();
}




ou tu peux aussi passer uniquement les objets dont tu as besoins au constructeur :
private TextBox
 _TxtBox1;

private TextBox _TxtBox2;

public Form2(TextBox 
aTxtBox1)
{
  _TxtBox1 = aTxtBox1;
  _TxtBox2 = aTxtBox2;
  InitializeComponent();
}
BR>si j'ai bien compris ton pb ca devrait marcher
Messages postés
42
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
31 mai 2009

Bonjour oximoron,
La réponse me convient bien, mais du coup si j'écris:

private Form1
_form1;
public Form2(Form1 aForm1)
{
  _form1= aForm1;
  InitializeComponent();
}

c'est mon form2 qui n'est plus instancier correctement dans form1.
Et si j'utilise ta méthode pour faire la meme chose à form1, c'est "program.cs" qui me dis qu'il ne connais plus form1.   loool   que faire?

J'ai 2 semaine de pratique, dsl d'etre aussi bete :)

D'avance merci     kiki.
Messages postés
149
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
30 janvier 2009

Il faut alors faire une classe qui connait les deux Form1 et Form2.






public class CMonTraitmentdesFentetres
{
  private static Form1 _Form1;
  private static Form2 _Form2;







  public CMonTraitmentdesFentetres()
  {
  }




  public static form_1
  {
    get { return _Form1; }
    set { _Form1= value; }
  }
  public static form_2
  {
    get { return _Form2; }
    set { _Form2 = value; }
  }
}






et dans program.cs





CMonTraitmentdesFentetres.form_1 = new Form1();
CMonTraitmentdesFentetres.form_2 = new Form2();

CMonTraitmentdesFentetres.form_1.show();
CMonTraitmentdesFentetres.form_2.show();

Voila voila avec un peu de chance ca marche. c'est peu être pas la meilleur solution, mais je ne sais pas ce que tu va en faire /SPAN>
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

nan mais on est tous là pour apprendre...et apporter des connaissances pour les uns et les autres..

Le souci que tu rencontre c'est en effet un problème d'enfant Parent...le problème est que ce dernier cas de figure tu souhaites lancé la Form2 comme parent donc ca pose des problèmes (enfin je crois que c'est ce qui se passe)..l'avantage c'est de traiter ce genre de manip depuis la fenetre parente...comme
<hr size= "2" width="100%" />et il faudrait que tu abonnes les evenement de la from2 à une méthode de la Form1 lorsque bien sur tu instancies la Form2 depuis la Form1 comme ceci

Class Form1

{

new Form2();//sans passage de la Form parente

Form2.Move += new EventHandler(Form1.Move_Form2);//ou l'evenement associé à la Form2 que tu désires traiter

private void Form2_Move(
object sender,
EventArgs e){

int cx =
Form2.Location.X;int cy Form2.Location.Y;form1.textBox2.Text cx.ToString();

form1.textBox1.Text = cy.ToString();
cy Form2.Location.Y;cx

Form2.Location.X;

}

}

<hr size="2" width="100%" />

De ce fait tu ne traite que les traitements à effectuer sur la Form1 dans la Form1 et ceux de la Form2 que dans la Form2 uniquement quand tel evt se déroule dans la from parent ou enfant..)

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
Messages postés
42
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
31 mai 2009

Je me suis peut etre mal expliquer:

Form1 est parent
Form2 est enfant

La Form1 est donc la fenetre principale d'ou j'envoie des actions et aussi d'ou je recoie des infos.
Il se trouve que dans mon Form1, j'ai deux textBox qui doivent me renvoyer les coordonnées X et Y de la Form2.

J'écris donc ceci dans ma Form2:

private

void Form2_Move(
object sender,
EventArgs e)
{

      int cx =
This.Location.X;

      int cy =
This.Location.Y;
       form1 .textBox2.Text = cx.ToString();
      form1.textBox1.Text = cy.ToString();
      cy =
This.Location.Y;
      cx =
This.Location.X;
}
Le probleme c'est que form1 est inconnu dans form2. Normale.
Donc ma question était comment instancier d'une maniere simple mon form1 dans form2?
Comme ca, quand mon form2 bougera, il enverra en temps reel les coordonnées sur mes deux textbox qui sont sur ma form1.
D'avance Merci.
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Relis ce que je t'ai posté et tu verras qu'avec ma solutionj tu n'as pas besoin de gérer les actions de la form1 dans Form2, c'est elle qui gère ses propres actions
 d'où
"
De ce fait tu ne traite que les traitements à effectuer
sur la Form1 dans la Form1 et ceux de la Form2 que dans la Form2
uniquement quand tel evt se déroule dans la from parent ou enfant..)
"

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

J'ai créé un source qui pourra t'aider

http://www.csharpfr.com/codes/GESTION-EVENEMENT-INTER-FORM_46232.aspx

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
Messages postés
42
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
31 mai 2009

Je te remercie pour ces infos, mais je suis débutant et j'aimerais que cantoné au méthode de base et classique pour ne pas m'enbrouiller.

Alors si quelqu'un à une solution simple à cela je vous remercie:

Form1 est parent
Form2 est enfant

La Form1 est donc la fenetre principale d'ou j'envoie des actions et aussi d'ou je recoie des infos.
Il se trouve que dans mon Form1, j'ai deux textBox qui doivent me renvoyer les coordonnées X et Y de la Form2.

J'écris donc ceci dans ma Form2:

private

void Form2_Move(
object sender,
EventArgs e)
{

      int cx =
This.Location.X;

      int cy =
This.Location.Y;
       form1 .textBox2.Text = cx.ToString();
      form1.textBox1.Text = cy.ToString();
      cy =
This.Location.Y;
      cx =
This.Location.X;
}
Le probleme c'est que form1 est inconnu dans form2. Normale.
Donc ma question était comment instancier d'une maniere simple mon form1 dans form2?
Comme ca, quand mon form2 bougera, il enverra en temps reel les coordonnées sur mes deux textbox qui sont sur ma form1.
D'avance Merci.
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

As tu regarder le source que je t'ai posté ? parce que ca répond bien à tes attentes....

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
Messages postés
42
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
31 mai 2009

oui, elle fonctionne mais elle n'est pas conventionnel.
Je voudrai simplement savoir comment  instancier ma form1 dans la form2? D'une maniere simple?
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Si je me souveisn il y a possibilité de récupérer le parent depuis l'enfant (comme par exemple des boites de dialogues)...


this.Parent marche bien...le problème est que tu veux travailler avec
des composants du form parent...en continuant la démarche tu peux
utiliser

(en partant de la form enfant pour pointer vers la form parent)

this.Parent.Controls["textBox1"]

....après en castant avec un tout ca tu dervais trouver une solution qui exploite les membres du control...

ceci dit , je n'ai pas fais de test donc considère ca comme "As is"...en poussant le truc tu peux aussi utiliser

this.Parent.Controls["textBox1"].Text = Location.X

mais je pense que ma solution de départ est meilleur car elle désolidarise le traitement des forms (et donc réexploitable depuis n'importe quel evenement) et de plus elle est respectueuse de la portée inter classe (et si le Textbox est en privé..tu fais comment ?)

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
Messages postés
233
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
25 octobre 2010

le probleme c'est surtout qu'il y connait rien à la programmation orienté objet et qu'il lache des mots sans savoir ce qu'ils signifient

instancier une classe = CREER une nouvelle instance d'une classe, ou pour simplifier créer une nouvelle variable de cette classe

deuxieme point: si tu veux modifier un controle sur ta porm parente, verifie en premier lieu que ce controle est public, par defaut un controle est privé...

Nul ne devient grand par la guerre...
Messages postés
42
Date d'inscription
lundi 26 février 2007
Statut
Membre
Dernière intervention
31 mai 2009

Ecoutes loulou je t'aime bien mais pousse pas trop loin.
Je suis peut etre débutant mais mes bouquin de chevet en c# font 1000 pages.
Je sais ce que veut dire "instancier" pour ta gouverne.
Et en me parlant de public et private pour les methodes et les declarations; t'as du me prendre pour un dédé...ou koi?

Je demande simplement une methode simple, méthodique, organisé, structuré et surtout conventionnelle quant à un probleme.
Le souci, c'est que les mecs peuvent pas s'empècher de te sortir un pavé de code.
L'enssentiel suffit...
Bisous loulou Miltiades
Messages postés
149
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
30 janvier 2009

@kikiokiller : Euh faut pas abuser non plus là, tu demandes de l'aide pour ton problème et tu te permet d'être agressif ... Je trouve que ca c'est gonflé "Le souci, c'est que les mecs peuvent pas s'empècher de te sortir un pavé de code. " tu as deux solutions, une que je t'ai proposé, elle marche et c'est simple. Et une autre que ecosmose t'as proposé qui est une facon un peu plus propre que la miènne mais ne sachant pas vraiment le but final de ton code, il est difficile de te donner le code parfait. Il existe plusieurs facon de faire il n'existe pas de technique parfaite, c'est à toi, aidé de tes livres de 1000 pages, pour que tu fasse "une methode simple, méthodique, organisé, structuré et surtout conventionnelle" à partir de tout ce qu'on t'as donné. "L'enssentiel suffit..." ca veut dire donnez moi un bout de code où j'ai juste besoin de faire un copié-collé sans réfléchir ?
Sinon ce que tu demande ca s'apelle Design pattern achêtes toi un autre livre là dessus ca répond à 100% à ce que tu veux.
Messages postés
46
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
30 septembre 2010

Bin là je suis dégouté de voir comment ce post s'est orienté vers l'agressivité...

et si le Textbox est en privé -> c'était juste pour te faire réfléchire sur la problématique de portée ce qui appuyait mon avis (et non mon ordre) sur l'interdépendance d'une form par rapport à une autre et laissant bien laver son linge sal chacun chez soi, ( traduction :  assigner des valeurs aux composants internes à la form et donc privé comme le rappele Miltiades) et juste avoir le sourire quand on va chercher son courier (les evenements qui provoque ces assignations) ..bon je divague mais j'essaye, malgrè toute ta montée d'orgueil, de répondre par l'humour et d'une éclipse légère qui vient obscurcir mon départ , je te laisse méditer sur TES quelques mots...
<hr size="2" width="100%" />2 semaine de pratique, dsl d'etre aussi bete :)
...
j'aimerais que cantoné au méthode de base et classique pour ne pas m'enbrouiller.
......


oui, elle fonctionne mais elle n'est pas conventionnel.
<hr size="2" width="100%" />
Notes aussi l'heure à laquelle je t'ai répondu  (31/03/2008 04:05:53) et tu comprendras que ce soir je suis las de constater ta réaction vis à vis de nos conseils qui me semblaient être de bonne sympathie, de motivation (un source rien que pour toi !) et d'une pédagogie conforme (ou conventionnelle selon tes propres mots) à la programmation Orienté Objet...

BINOME de ECOSMOSE
Association ecologique d'actions de culture et d'Informations
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

Je suis d'accord, je ne vois pas d'autres manières plus simples pour recuperer le parent qu'en le passant en parametre du constructeur de l'enfant, et d'ecrire dans ton parent une methode public void setTextBoxValues(String text1, String text2)
qui pourra etre appelée par l'enfant.
Si tu crées dans l'enfant une nouvelle instance du parent tu va te retrouver avec deux fenetres parent a mon avis ...