Actualisation

Signaler
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011
-
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011
-
Bonjour, ma question est la suivante. J'ai fait une petite application avec deux fenetres. Une principale et une seconde qui en découle grâce à un bouton.

Je saisie dans ma seconde fenêtre un mot qui doit s'afficher dans la premiere une fois revenu dedans. Voila !!

J'espère que vous avez compris. Merci

20 réponses

Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
Bon.. euh.. T'as pas vraiment mis de question..



Mais si ton problème revient à envoyer des messages entre deux fenêtres,

le plus propre est d'utiliser des events,

tu trouveras pas mal d'infos en cherchant sur ce forum,

par exemple ici : [forum.v2.aspx?ID=484044 http://www.csharpfr.com/forum.v2.aspx?ID=484044]



tu peux aussi consulter le sujet

"Liens entre form et class, je sais c souvent demander, mais je ne comprend pas toujours les reponses [ .NET ] "

ici : [forum.v2.aspx?ID=484702 http://www.csharpfr.com/forum.v2.aspx?ID=484702]
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Si la question est (oups j'ai pas mis de ? ) :) donc :
Je veux saisir un mot dans la seconde fenetre et quand je clique sur retour (this.close) et que j'arrive sur la page principal, le mot doit s'afficher.

En faite, le mot que je saisie dans la seconde fenetre s'enregistre dans ma bdd mysql. Et donc quand je reviens sur ma page principal, je souhaite qu'il inspecte a nouveau la bdd.

Je suis plus clair !!! :)
Merci
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Comme le dit Troborg, tu peux utiliser un Event.

Autrement, il te reste le simple et traditionnel passage par référence.



Voir l'exemple ci-dessous

Mx



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

using System;

using System.Drawing;

using System.Windows.Forms;



namespace WindowsApplication2

{

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;



public Form1()

{

InitializeComponent();



}





private void InitializeComponent()

{

this.button1 = new System.Windows.Forms.Button();

this.textBox1 = new System.Windows.Forms.TextBox();

this.SuspendLayout();

//

// button1

//

this.button1.Location = new System.Drawing.Point(88, 32);

this.button1.Name = "button1";

this.button1.TabIndex = 1;

this.button1.Text = "Fenetre";

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// textBox1

//

this.textBox1.Location = new System.Drawing.Point(80, 80);

this.textBox1.Name = "textBox1";

this.textBox1.TabIndex = 2;

this.textBox1.Text = "";

//

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 125);

this.Controls.Add(this.textBox1);

this.Controls.Add(this.button1);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);



}



[STAThread]

static void Main()

{

Application.Run(new Form1());

}



private System.Windows.Forms.TextBox textBox1;



private void button1_Click(object sender, System.EventArgs e)

{

Form2 f = new Form2();

if(f.ShowDialog() == DialogResult.OK)

this.textBox1.Text = f.TexteARecuperer;

}



}



public class Form2 : System.Windows.Forms.Form

{

private System.Windows.Forms.TextBox textBox1;

private Button button;



public Form2()

{

InitializeComponent();

}



public string TexteARecuperer

{

get { return this.textBox1.Text;}

}



private void InitializeComponent()

{

this.textBox1 = new System.Windows.Forms.TextBox();

this.SuspendLayout();



this.textBox1.Location = new System.Drawing.Point(80, 64);

this.textBox1.Name = "textBox1";

this.textBox1.TabIndex = 0;

this.textBox1.Text = "textBox1";

this.button = new Button();

this.button.Text = "fermer";

this.button.Click += new EventHandler(button_Click);

this.Controls.Add(button);



this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 273);

this.Controls.Add(this.textBox1);

this.Name = "Form2";

this.Text = "Form2";

this.ResumeLayout(false);

}



private void button_Click(object sender, EventArgs e)

{

this.DialogResult = DialogResult.OK;

this.Close();

}

}

}
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Vous etes sur qu'il n'y a pas un moyen qui correspond mieux a ce que j'ai deja.
Voici ce que j'ai fais :

CODE

string MySQLCmd = "select * from reseaux where `compte`='"+Environment.UserName+"'";
MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd, connect);
MyAdapter.Fill(ds);
foreach ( DataRow dtRow in ds.Tables[0].Rows)
{
string utilisateur = (string)dtRow["utilisateur"];
if(utilisateur=="")
{
login.Text = "Utilisateur : " + Environment.UserName;
}
else
{
login.Text = "Utilisateur : " + utilisateur;
}
}

Je récupère le login du PC, puis je cherche dans la bdd s'il est déjà enregistré.

Si NON, j'affiche le nom du PC, si OUI, j'affiche un nom qui lui a été associé.

Donc il doit bien exister un moyen de relire la bdd a chaque fois que je retourne sur la page principal !!!!

Merci
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Le probleme la dedans, c'est que je vois pas pourquoi tu nous demande quelque chose dont tu as la réponse.

Si c'est juste le fait de la récuperation lors du retour dans la page
principale, alors tu as les elements de reponse dans nos différents
posts.

Autrement, donne nous plus précisément ton probleme

Et puis, pourquoi vouloir relire la bdd a chaque fois que tu retourne sur la page principale ?



Sinon, ote moi un doute, tu parles de WinForms ou de Webforms ?

Mx
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Bah je souhaite relire la bdd, car dans la second Form, j'ai fais un UPDATE de la bdd et donc si je ne relis pas la bdd, je ne peux pas voir que la valeur a été modifiée !!!

Je vois comment faire !!! Merci
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
Même en ayant fait un update dans la form, ce n'est pas forcément un motif pour ré-interroger la base de donnée quand tu reviens dans la form principale..
(Générallement on évite d'interroger une base quand on peut facilement l'éviter..)

En fait tout dépend si les accès à ta base de donnée sont couteux...
Si tu n'as pas de contrainte en terme "nombre d'accès à la base de donnée", rien ne t'empèche de l'interroger à chaque fois que tu reviens sur la form principale...

Si tu veux améliorer tes performances, la solution des events est intéressante...

Tout dépend ce que tu veux faire..
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Oui je peux accéder tant que je veux a la bdd, ce n'est pas le problème. Mais pourquoi quand je reviens sur la form, il ne relis pas dans la bdd comme si le Load de la form principal était lu qu'une seule fois !!!!
Peux être que c'est parce que je ne la ferme pas entre les deux form !!
Je fais
Anabel anabel = new Anabel();
anabel.ShowDialog();

Merci de votre aide
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
ok..

J'ai saisis ce que tu voulais faire...



En fait le load de ta fenêtre principale n'est appelé qu'au chargement de celle-ci...

Quand tu appelles une autre fenêtre modale puis que tu la quittes et
reviens dans ta fenêtre principale, la méthode load de celle-ci n'est
pas rappelée...



Si tu souhaites effectuer des actions à la fois dans ton load et quand tu quittes les fenêtres modales,

tu peux par exemple définir une méthode :



private void monRefreshAMoi()

{

....

}



que tu appelleras à la fois dans le load, et après la fermeture de tes fenêtres modales (bref, après tes "ShowDialog" !).



Voila, a priori ça doit résoudre ton problème..





(PS : mais les events.. C'est sympa aussi.. et ça pouvait marcher... lol... )
Messages postés
14
Date d'inscription
lundi 11 juillet 2005
Statut
Membre
Dernière intervention
23 avril 2008

Le plus simple est de renvoyer le résultat de ton Update dans un event
a ta première fenêtre, je ne pense pas que ce soit la peine de relire
ta BDD (couteux en terme de temps). Et pour la question du Load, c'est
juste au chargement de ta fenetre, si tu veut ré-executer ton Load il
faut fermer et réouvrir ton form ...
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

je veux bien que tu m'explique en quoi consiste le events et comment je peux m'en servir lol ;)
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Ah bah on y arrive
Si tu t'interesses aux event, il y a les liens cités par Troborg plus haut.



Ou cette source de Bidou


Mx
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
Rien à ajouter pour ma part !

La source citée ci-dessus à l'air pas mal !



Si tu as des questions, n'hésite pas !!
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Cela serait possible de faire un bouton dans ma seconde form, qui ferme sa propre form et la form principal puis la relance !!!

Merci
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
Euh..

Je ne saisis pas trop l'intérêt...



Si ton objectif est de recharger la forme principale, tu peux (dans la form principale) :

- appeler la fonction load après que la 2nde form ait rendu la main (après le "ShowDialog")

ou

- comme proposer ci-dessus, définir et utiliser une méthode "monRefreshAMoi()" que tu appelleras à la fois dans le load, et après la fermeture de la 2nde form.



(ces 2 méthodes revenant strictement au même !)



Le problème de vouloir fermer la form principale, c'est que
généralement toutes les autres forms en dépendent... et que donc elles
se retrouveraient fermées en même temps...

Pour faire ce que tu veux, il faudrait que ce soit géré avant ta form
principale, bref dans la fonction "Main" (qui se trouve générallement
dans un fichier "Program.cs" si tu utilises Visual Studio).. Et ça
risque de devenir du bidouillage inutile...



(Sans compter que pour l'utilisateur, voir la form se fermer et se réouvrir n'est pas forcément terrible)
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

J'ai essayer de mettre ca dans ma seconde form mais ca marche pas. Je suis dans mon bouton qui enregistre et qui reviens sur la page principal !!!

this.Close();
Principale_Load();

Merci
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
Que contient ta méthode "Principale_Load()" ?



Le plus facile serait peut-être que tu te fasses une méthode "Principale_Load" (ou autre !) dans ta form principale,

puis que tu l'appelles après le "ShowDialog()", toujours dans la form principale.



Faire la mise à jour que tu veux au moment où l'exécution revient dans ta form principale est simple.

Par contre lancer cette même mise à jour depuis une autre form te
demande quelques manipulations supplémentaires (en fait ça demande
d'utiliser une référence telle que proposée par [auteurdetail.aspx?ID=5912 MorpionMx] ou dans le lien que j't'avais filé : [forum.v2.aspx?ID=484702 http://www.csharpfr.com/forum.v2.aspx?ID=484702])



Si tu voulais mettre la form principale à jour régulièrement, utiliser des références ou des events serait nécessaire,

mais dans la mesure où tu ne souhaites la mettre à jour qu'au moment où
tu retournes dessus, ça te demandera moins de travail de faire la mise
à jour depuis la form principale elle-même..



J'suis certain que tu y es presque !!

Courage !
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

Bon, le mieux je te montre directement :
Dans la form principal :

private void Principal_Load(object sender, System.EventArgs e)
{
while (!(this.reseau.Enabled = File.Exists("config.xml")))
{
MessageBox.Show("Première utilisation de l'application, veuillez enregistrer vos paramètres");
Parametre parametre = new Parametre();
parametre.ShowDialog();
}


Principal formtest = new Principal();
login.Text = "Utilisateur : " + Environment.UserName;
MySqlConnection connect = new ByteFX.Data.MySqlClient.MySqlConnection("Database=carrefour;Data Source=localhost;User Id=root;Password=");
connect.Open();
string MySQLCmd = "select * from reseaux where `compte`='"+Environment.UserName+"'";
MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd, connect);
MyAdapter.Fill(ds);
foreach ( DataRow dtRow in ds.Tables[0].Rows)
{
string utilisateur = (string)dtRow["utilisateur"];
if(utilisateur=="")
{
login.Text = "Utilisateur : " + Environment.UserName;
}
else
{
login.Text = "Utilisateur : " + utilisateur;
}
}
}

Voici le code du bouton permettant d'afficher l'autre form

private void button1_Click(object sender, System.EventArgs e)
{
Parametre parametre = new Parametre();
parametre.ShowDialog();
}

Maintenant, voici le code, qui enregistre et quitte cette form pour retourner sur la première form :

private void Enregistrer_Click(object sender, System.EventArgs e)
{
if ( (tbhote.Text.Length 0) || (tblogin.Text.Length 0) || (tbbase.Text.Length == 0) || (VotreNom.Text.Length == 0) )
{
MessageBox.Show("Les champs Serveur - Utilisateur - Base - Nom doivent être remplis !!!", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

else
{
string ConnnectionStr2 = String.Empty;
ConnnectionStr2 = "Database=carrefour;Data Source=localhost;User Id=root;Password=";
Connection.ConnectionString = ConnnectionStr2;
Connection.Open();

string MySQLCmd2 = "select * from `reseaux` WHERE `ip`='1.1.1.1'";
MyAdapter.SelectCommand = new MySqlCommand(MySQLCmd2, Connection);
MyAdapter.Fill(ds2);

if(ds2.Tables[0].Rows.Count == 0)
{
MessageBox.Show("INSERT");
string MySQLCmd = "INSERT INTO `reseaux` (`ip`,`compte` , `utilisateur`) VALUES ('1.1.1.1','" + Environment.UserName + "','" + VotreNom.Text + "')";
MySqlCommand cmd = new MySqlCommand(MySQLCmd, Connection);
cmd.ExecuteNonQuery();
}

else
{
MessageBox.Show("UPDATE");
string MySQLCmd = "UPDATE `reseaux` SET `utilisateur`='" + VotreNom.Text + "'";
MySqlCommand cmd = new MySqlCommand(MySQLCmd, Connection);
cmd.ExecuteNonQuery();
}

XmlTextWriter xmlTextWriter = new XmlTextWriter("config.xml",System.Text.Encoding.UTF8);

xmlTextWriter.Formatting = Formatting.Indented;

xmlTextWriter.WriteStartDocument();
xmlTextWriter.WriteStartElement("connexion");
xmlTextWriter.WriteElementString("serveur",tbhote.Text);
xmlTextWriter.WriteElementString("utilisateur",tblogin.Text);
xmlTextWriter.WriteElementString("passe",tbpwd.Text);
xmlTextWriter.WriteElementString("base",tbbase.Text);
xmlTextWriter.WriteElementString("IP",AdresseIP.Text);
xmlTextWriter.WriteEndElement();
xmlTextWriter.Flush();
xmlTextWriter.Close();
MessageBox.Show("Vos paramètres sont enregistrés avec succès");
this.Close();
}
}

Donc tu peux voir que je stocke le nom modifié dans la base de données. Et c'est ceci que je rappelle normalement dans le Load de la première form

J'espère t'avoir éclairé un peu plus sur le principe de fonctionnement de mon appz !!! Merci de votre aide
Messages postés
65
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
1 août 2005
4
Pour répondre à la question de base,

il faut que tu mettes : "Principal_Load();" après "parametre.ShowDialog();" dans la méthode "button1_Click"





J'ai cependant quelques remarques sur le reste du code :

- la form "formtest" n'est jamais utilisée

- a priori tu ne fermes pas les connections que tu ouvres... ("connect.Close();")

- parfois tu utilises "tblogin.Text", parfois "VotreNom.Text" (j'ai l'impression que c'est sensé être la même chose... je me trompe ?)



A la place de :

foreach ( DataRow dtRow in ds.Tables[0].Rows)

{

string utilisateur = (string)dtRow["utilisateur"];

if(utilisateur=="")

login.Text = "Utilisateur : " + Environment.UserName;

else

login.Text = "Utilisateur : " + utilisateur;

}

tu peux te contenter de faire :

string utilisateur = (string)(ds.Tables[0].Rows[ds.Tables[0].Rows.Count])["utilisateur"];

if(utilisateur=="")

login.Text = "Utilisateur : " + Environment.UserName;

else

login.Text = "Utilisateur : " + utilisateur;

(la boucle ne sert à rien.. vu que tu ne gardes que la dernière valeur)





Au passage :

la façon que tu utilises pour écrire tes requêtes sql est assez dangereuse car attaquable par injections sql..

Il vaudrait mieux que tu utilises des paramètres !

(ou au minimum ajouter ".Replace("'","''");" à toutes les chaines que tu passes... par exemple après "Environment.UserName" et "utilisateur" mais ça reste dangereux)



Un exemple d'utilisation de paramètres pour sql (pour mysql je présume que ça doit être pareil..)

string MySQLCmd = "UPDATE `reseaux` SET `utilisateur`=@user";

SqlCommand cmd = new SqlCommand(sqlcmd, cnx);

SqlParameter parm = cmd.Parameters.Add("user", SqlDbType.VarChar);

parm.Value = VotreNom.Text;



Voila....

Bon, normalement avec le "Principal_Load();" placé au bon endroit, ça devrait aller..



J'attends tes retours !
Messages postés
345
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
13 mai 2011

CITATION : parfois tu utilises "tblogin.Text", parfois "VotreNom.Text" (j'ai l'impression que c'est sensé être la même chose... je me trompe ?)

Non ce n'est pas la meme chose, le login c'est par rapport a la bdd et le nom, c'est le votre !!!

Par contre, le Principal_Load(); je ne dois pas le positionner au bon endroit car cela ne change rien !!!! Je l'ai mis après la fermeture de la seconde form !!!

Merci