none
[Résolu]Donnée de form2 dans Form1 RRS feed

  • Question

  • Bonjour,

     

    J'ai ici une form "envoieEnvoieAddDestinataire qui contient juste une CheckListBox et un bouton ajouter.

     

    Dans cette CheckListBox, doit s'afficher mes clients de ma DB.

    Lorsque j'en séléctionne et clic sur "OK", cette fenetre ce ferme et dans ma frmEnvoieEmail.cs dans la textBox destinataire, doit s'afficher tout les clients qui ont été séléctionné séparé de virgule.

     

    Actuellement, voici le code que j'ai. N'étant pas sur de ce que je fais, j'ai commenter chaque ligne afin que vous puissez mieux comprendre.

     

    private void frmEnvoieEmailAddDestinataire_Load(object sender, EventArgs e)

    {

    //connection … la DB

    dataBase selectClient = new dataBase();

    //SELECT clients

    bool selectStatus = false; //j'‚tablie un status r‚ussis/echec

    selectStatus = selectClient.connectDB(); //Je vais chercher la fonction select pour mes clients et la join a mon status

    string chkClient = selectClient.connectDB(); //Je veux stockers mes clients dans chklist

    for (int i = 0; i < chkClient; i++) //pour chaque clients de ma liste

    {

    chkClients.Items; //Rajoute un item checkable ma ma forme.

    //Ceux qui seront cliquer iront dans ma forme pr‚c‚dente s'ajouter comme clients a recevoir le mail

    }

    }

     

     

    Comme vous pouvez le remarquer, le code n'est ni complet, ni fonctionnel:

     

    Avertissement 1 Impossible d'atteindre le code détecté 

     -> Ceci ce situ dans ma fonction selectClient de dataBase.cs qui est:

    public bool selectClient()

    {

    //Cr‚ation de la commande

    dataBase connectDB = new dataBase();

    MySQLCommand cmdSQL = new MySQLCommand();

    string strCommandToExecute = "SELECT name, firstName from xdb_client";

    cmdSQL.CommandText = strCommandToExecute;

    bool selectStatus = false;

    if(selectStatus == true)

    {

    return true;

    }

    else

    {

    return false;

    }

    return selectStatus;

    }

     

     

    Erreur 2 Impossible de convertir implicitement le type 'bool' en 'string'

    ligne:

    string chkClient = selectClient.connectDB();

     

    Erreur 3 L'opérateur '<' ne peut pas être appliqué aux opérandes de type 'int' et 'string' 

    ligne:

    for (int i = 0; i < chkClient; i++)

     

    Erreur 4 Seuls une assignation, un appel, un incrément, un décrément et des expressions d'objet new peuvent être utilisés comme instruction

    ligne:

    chkClients.Items;






     

    jeudi 27 mars 2008 09:43

Toutes les réponses

  • Je me doutais un peu de cette erreur (la première)  en regardant ton code de l'autre question.

     

    Bon on va d'abord se concentrer sur cette erreur là qui devrait pas mal te faire avancer, ensuite tu reposteras ce qu'il te reste car je commence à m'y perdre un peu

     

    Ton problème principal est que tu sembles confondre la méthode selectClient et l'instance selectClient.

     

    Pour être plus clair renomme:

    dataBase selectClient = new dataBase();

    en

    dataBase monSelecteurDeClient= new dataBase(); //Ou n'importe quel nom mais surtout pas selectClient

     

    ensuite on y vois un peu plus clair et on va faire dans la méthode principale

     

    monSelecteurDeClient.connectDB(); // Se charge de se connecter à la base

     

    monSelecteurDeClient.selectClient(); // Fait effectivement le select et rempli le dataset

     

    Peux tu commencer par nettoyer ton code dans ce sens là puis le reposter (je pense dans le message get/set; on reviendra à celui là après) et on regardera ensemble le contenu du selectClient() qui ne me parait pas encore très fonctionnel.

    Bon je retourne à mon code (je te répondrai fin d'après midi)

     

    PS: l'erreur 2: ton connectDB renvoie un booléen donc tu peux pas le mettre dans une string

    L'erreur 3: on regardera une fois le code un peu plus clair mais je pense qu'il faudra réécrire tout ça!

    jeudi 27 mars 2008 10:35
  •  

    Voila donc ce que sa donne:

     

    private void frmEnvoieEmailAddDestinataire_Load(object sender, EventArgs e)

    {

    //connection … la DB

    dataBase monSelecteurDeClient = new dataBase();

    monSelecteurDeClient.connectDB(); // Se charge de se connecter … la base

    monSelecteurDeClient.selectClient(); // Fait effectivement le select et rempli le dataset

    //SELECT clients

    bool selectStatus = false; //j'‚tablie un status r‚ussis/echec

    selectStatus = monSelecteurDeClient.connectDB(); //Je vais chercher la fonction select pour mes clients et la join a mon status

    //TODO : Faire une boucle pour recup‚r‚ tout les clients

    }

     

     

    Edit: Il faut que sa fasse:

    [x] Nom, Prénom, Adresse

    dans ma checklist.ce serait l'idéal.

     

    Voici une illustration des plus rapides pour illustré ce problème que j'ai (qui va revenir, très souvent)

    http://img520.imageshack.us/my.php?image=lesmodifsui2.png

     

    Meilleures salutations

    jeudi 27 mars 2008 10:47
  •  

    Bonjour,

     

    Bon j'espère que t'es en forme car il y a du pain sur la planche.

     

    Bon en suivant ton schéma (heureusement mon Iphone m'a permis de le voir car websense bloque cette URL) J'ai identifié 3 étapes:

     

    La première est celle de l'initialisation du formulaire que je vais aborder ci dessous.

    La deuxième est la récupération des infos de la checklist (ce que je vais expliquer dans la première partie est fait pour simplifier l'explication ici). Je te donnerai l'explication une fois que tu auras implémenté la première partie (ça me laisse le temps d'y réfléchir)

    La troisième sera la récupération des données de ce form par celui qui l'a appelé (on abordera ça aussi tout à l'heure)

     

    Donc tout d'abord on va se fabriquer une petite classe super pratique pour rajouter en items de la checklist.

    class MyItem

    {

    private String _firstName;

    public String FirstName

    {

    get { return _firstName; }

    set { _firstName = value; }

    }

    private String _lastName;

    public String LastName

    {

    get { return _lastName; }

    set { _lastName = value; }

    }

    private String _address;

    public String Address

    {

    get { return _address; }

    set { _address = value; }

    }

    public MyItem(String firstName, String lastName, String address)

    {

    FirstName = firstName;

    LastName = lastName;

    Address = address;

    }

    public override string ToString()

    {

    return FirstName + " " + LastName + " " + Address;

    }

    }

    Bon c'est du code dotnet 2.0 (en 3.0 on pourrait simplifier tout ça)

     

    A quoi va servir cette classe: Comme tu le vois elle va servir à stocker nom, prénom, adresse et à les afficher ensemble grace à la surcharge de ToString

    Ce qu'il faut savoir c'est que quand tu rajoute un item dans une listBox ou une checkedlistbox tu n'est pas obligé de passer simplement une chaine de caractère mais tu peux y passer un objet complexe à une seule conidtion. Cet objet doit implémenter ToString qui servira à l'affichage. Attention il faut bien faire un override de ToString; C'est super pratique et je l'utilise très souvent.

     

    Ceci étant dit comment allons nous l'utiliser.

     

    En considdérant que dans ton frmEnvoieEmailAddDestinataire_Load tu as complété avec ce qu'on a fait hier pour remplir une dataTable (appelons la myTable pour l'exemple) voici ce que l'on écrirait pour remplir la checkedlist:

    foreach(DataRow row in myTable.Rows)

    {

    MyItem myItem = new MyItem(row["firstName"].ToString(),row["name"].ToString(),row["address"].ToString());

    checkedListBox1.Items.Add(myItem);

    }

     

    le foreach balaye le contenu du dataset ligne par ligne (row) et crée un MyItem en se servant des infos (note pense à corriger ta requête SQL car pour l'instant elle retourne juste id, firstName et name et pas address sinon t'auras un crash) puis l'ajoute à la checkedListBox et voila le tour est joué.

    Attention en rouge se trouve le nom exact des champs retourné par ton select. Les deux premiers sont basés sur le travail d'hier (avec ce qui était dans le fichier XML) et le troisième j'ai supposé que tu appelerai la colonne comme ça, sinon pense à le changer.

     

    Bon je te laisse implémenter, compiler et tester (je me suis servi de ton fichier XML et ça marche bien) et on abordera la suite.

     

    A tout à l'heure,

     

    vendredi 28 mars 2008 10:08
  • Tu es vraiment mythique comme gars Stick out tongue

     

    bref voila ce que sa me donne:

    J'ai créé en copier/coller ta class MyItem.cs puis mis le code ainsi:

     

     

     

    private void frmEnvoieEmailAddDestinataire_Load(object sender, EventArgs e)

    {

    //connection … la DB

    DataBase mydatabase = new DataBase("localhost", "courtage", "root");

     

    //TODO : Faire une boucle pour recup‚r‚ tout les clients

    foreach (DataRow row in myTable.Rows)

    {

    MyItem myItem = new MyItem(row["firstName"].ToString(), row["name"].ToString(), row["address"].ToString());

    chkClients.Items.Add(myItem);

    }

    }

     

    Comme je suis unique et que chez moi sa fonctionne jamais du premier coup, voici le code d'erreur:

    Erreur 1 Le nom 'myTable' n'existe pas dans le contexte actuel

     

    Smile

     

    Meilleures salutations !

     

    vendredi 28 mars 2008 10:18
  • Mythique? pkoi?

     

    Ben t'as oublié de créer et remplir la datatable :-)

    rajoute ça juste avant:

    //TODO : Faire une boucle pour recup‚r‚ tout les clients

     

     

    bool connectionStatus = mydatabase.SelectClient("SELECT id, name, firstName,address FROM xdb_client;");

    if (connectionStatus == true)

    {

    lblAction.Text = "Connection SuccŠs";

    }

    else

    {

    lblAction.Text = "Connection ‚chec";

    }

    //utilisation du dataset

    DataTable myTable = mydatabase.myDataTable;

     

    n'oublie pas de rajouter la colonne address dans ta table xdb_client sinon tu vas avoir des problèmes.

     

    Oups déjà 11h30, bon je te laisse un peu j'ai quand même un petit bout de code à terminer de mon côté! (un petit traitement de string)

    vendredi 28 mars 2008 10:28
  • Super !

     

    Je pense que l'étape suivante est l'évenement clic de la Form au chkClient pour que sa s'affiche dans la form du mail séparé de virgule?

     

    Merci encore pour ton aide, bon code et si on se revoi po, a cet après midi Wink

     

    vendredi 28 mars 2008 10:45
  • Bon pause café

     

     

    On va implémenter le click maintenant (ainsi que l'appel de ce form après ?)

     

    D'abord on va commencer par se rajouter dans frmEnvoieEmailAddDestinataire une propriété pour stocker le résultat.

    Donc on va faire une truc:

    public partial class frmEnvoieEmailAddDestinataire : Form

    {

    //Début du code à rajouter

    private String _result;

    public String Result

    {

    get { return _result; }

    set { _result = value; }

    }

    //fin du code à rajouter

     

    ensuite dans la fonction click on met ce code:

    private void button1_Click(object sender, EventArgs e)

    {

    Result = "";

    foreach (MyItem myItem in checkedListBox1.CheckedItems)

    {

    Result += myItem.Address + ",";

    }

    Result = Result.Substring(0, Result.Length - 1);

    DialogResult = DialogResult.OK;

    this.Hide();

    }

     

    Bon ton bouton doit s'appeler autrement que bouton1 mais on va dire que j'étais pas inspiré

     

    Donc que fait ce code?

    Il parcourt les éléments sélectionnés de la checkedLisBox et ... miracle les cast en notre fameux MyItem (c'est la fameuse magie dont je parlais ce matin)

    Du coup on peut récupérer ce qui nous intéresse (à savoir juste l'adresse) et la stocker dans une chaine résultat (Result qui est la fameuse propriété)

    A la fin on enlève le dernier caractère (ben oui sinon on a une virgule en trop), on dit que tout s'est bien passé (DialogResult.OK) et on cache la fenêtre (essentiel pour le showdialog)

     

    Maintenant qu'on a fait ça regardons le code de la form1 (celle qui appelle frmEnvoieEmailAddDestinataire )

     

    Dans un bouton click on va faire:

    frmEnvoieEmailAddDestinataire monDialogue= new frmEnvoieEmailAddDestinataire ();

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

    {

    Console.WriteLine(monDialogue.Result);

    }

     

    Moi j'ai juste mis un Console.WriteLine mais je suppose que tu voudras plutôt recopier le résultat dans une textbox ou autre chose.

     

    Une fois que tu es sur que tu n'auras plus besoin de la fenêtre l'idéal serait de faire un monDialogue.Dispose(); mais sur une petit appli ça ne manquera pas vraiment (j'ai tendance à l'oublier, c'est pas bien )

     

    Une dernière chose pourquoi faire ça dans le if? Ben au cas où la personne clique sur la croix du form (ou si tu mets un bouton cancel avec

    DialogResult = DialogResult.Cancel;

    this.Hide();

    ) ben il ne faut rien faire dans ce cas.

     

    Voila amuses toi bien et bon week end si on ne se revoie pas!

     

    Petit détail: Précdemment j'ai oublié un truc. dans ton load il faudrait rajouter au début:

    checkedListBox1.Items.Clear();

    Ca enlève tout items de la checkedlistbox1 (au cas ou tu appelles la même plusieurs fois ça serait bête de dupliquer le contenu à chaque fois donc on nettoie au début, simple précaution)

     

    vendredi 28 mars 2008 14:28
  • Plop,

     

    ça fonctionne Smile

     

    Nous avons encore un soucis pour la partie des e-mails, Il y a la possibilité d'utiliser des lettres types écrite sous word et donc en .doc. Lorsque le gars openFileDialog une de ces lettre, le contenu du .doc doit s'afficher dans mon "ltxtMessage.Text" qui est le body Smile

     

    De tête j'imagine un truc du style:

     

    //OpenFileDialog (ca c'est ok)

    //Pour chaque ligne, affiche dans ltxtMessage.Text

    //Fin

     

    En code:

     

    private void button2_Click(object sender, EventArgs e)

    {

    //TODO : Sortir des .DOCS, et inscrire leur contenu au format HTML Qui partira par e-mail

    openFileDialog2.InitialDirectory = @"C:\";

    openFileDialog2.Title = "Selectionner un fichier";

    openFileDialog2.FileName = "";

    openFileDialog2.Filter = "Fichier Word (*.doc)|*.doc";

    if (openFileDialog2.ShowDialog() != DialogResult.Cancel)

    {

    ltxtMessage.Text = openFileDialog2.ToString();

    }

    else

    {

    MessageBox.Show("Impossible d'ouvrir l'‚l‚ment.", "envoie message", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    }

     

    Actuellement le résultat me donne:

    System.Windows.Forms.OpenFileDialog: Title: Selectionner un fichier, FileName: C:\Users\Yannick\Desktop\test.doc

     

     

    Je te remercie quand même de toute l'aide que tu m'apportes !

     

    (P.S: Si on se revoit pas --> saches que je serai présent dimanche (a partir d'environ 15h, A+, bon week)

    vendredi 28 mars 2008 15:03
  • Je suis pas sur de comprendre:

     

    Si dans ltxtMessage.text tu veux le nom du fichier sélectionné tu fais simplement:

    ltxtMessage.Text =openFileDialog1.FileName;

     

    Si tu veux ouvrir le contenu de ton word dans une textbox .... heu ... plus compliqué  Je l'ai fait en quelque sorte (pour une agence web qui voulait des templates justement pour faire des emails types) et je pourrai t'expliquer la démarche mais c'est pas avec un .doc mais avec un rtf qu'il faut travailler (et avec le composant richtextbox). Si c'est ce que tu veux faire démarre un nouveau post car c'est plus vraiment le même sujet et c'est assez vaste en fait.

     

    Je pense que je suis encore dans le coin pour une petite heure et après week end (et là je t'avoue que je passe plus de temps à jouer qu'à coder ). Je ferai peut être un petit saut dimanche soir quand même. Si j'ai le courage je posterai une explication complète sur le rtf et le richtext sur mon blog (avec un projet complet?).

     

    vendredi 28 mars 2008 15:38
  • Tu joues a quoi? Bon, go nouveau poste xD

    si tu préfère le direct ->
    irc.geeknode.org
    port: 6667
    chan [:#]developpement-csharp

    msn: gonightwish@hotmail.com

    A+
    vendredi 28 mars 2008 19:13