none
get set et récup e-mail RRS feed

  • Question

  • Bonjour,

     

    Voilà un get set qui pu ! :}

     

    En effet, ma form1 possède un dataGridView avec un champ e-mail du client.

     

    Lorsque l'on clic sur le bouton "e-mail", sa doit récupéré son adresse e-mail et l'inscrire dans les destinataire:

     

    Form frmEnvoieEmail = new frmEnvoieEmail();

    frmEnvoieEmail.Destinataire = dataGridView1.CurrentRow.Cells["email"].Value;

    frmEnvoieEmail.Show();

     

     

    Dans la formEnvoieEmail:

     

    private string _Destinataire;

    public string Destinataire

    {

    get { return _Destinataire; }

    set { _Destinataire = value; }

    }

     

     

    Le truc, c'est qu'il est aussi possible de les sélectionner à partir d'un bouton:

     

    frmEnvoieEmailAddDestinataire monDialogue = new frmEnvoieEmailAddDestinataire();

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

    {

    txtDestinataire.Text = monDialogue.Result;

    }

     

     

    Il doit donc faire la différence et pas supprimer ce que y a deja! Mais bref, le vrai soucis ici c'est que si dans ma form1 je fais:

    frmEnvoieEmail.

     

    il me trouve pas l'bojet Destinataire !

     

    pourquoi?

    mardi 13 mai 2008 08:48

Réponses

  • Je n'avais pas compris que tu voulais mettre à jour la textbox en fait.

    Bon j'ai re regardé ta classe et il y a quelques modifs à faire.

     

    Tout d'abord remets le code que je t'ai fait changer ce matin car ce n'est pas là que l'on doit agir.

     

    Il y a 2 choses à faire en suite:

     

    1 - initialiser le txtDestinataire avec la valeur de _Destinataire (je te conseille de le faire dans le set de la propriété.

    remplace:

    Code Snippet

    public string Destinataire

    {

    get { return _Destinataire; }

    set { _Destinataire = value; }

    }

     

     

    par:

    Code Snippet

    public string Destinataire

    {

    get { return _Destinataire; }

    set { _Destinataire = value;

    txtDestinataire.Text = _Destinataire;

    }

    }

     

     

    Note: Attention si tu refait un appel au set ailleurs dans le code cela te réinitialisera txtDestinataire (si cela devient le cas il faudra le prendre en compte)

     

    2- modifier button2 (celui qui permet de rajouter des destinaires) pour prendre en compte qu'il peut déjà y avoir des données

    remplace:

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    frmEnvoieEmailAddDestinataire monDialogue = new frmEnvoieEmailAddDestinataire();

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

    {

    txtDestinataire.Text = monDialogue.Result;

    }

    }

     

     

    par:

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    frmEnvoieEmailAddDestinataire monDialogue = new frmEnvoieEmailAddDestinataire();

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

    {

    if(txtDestinataire.Text =="")

    txtDestinataire.Text = monDialogue.Result;

    else

    txtDestinataire.Text += ',' +monDialogue.Result;

    }

    }

     

     

    Ici je vérifie qu'il n'y a rien et si le champ contient déjà des valeurs je rajoute la dernière arpès une virgule (au passage on aurait déjà du le faire auparavant mais tu n'as peut être jamais ajouté 2 destinataires pour découvrir le problème )

     

    mercredi 14 mai 2008 08:16
  • Hum ici l'erreur n'a rien à voir avec le code présent Je pense que tu as créé une propriété Name dans ton frmEditClient alors que c'est une propriété existante des Form. Change le nom de cette propriété pour éviter tout conflit ultérieur.

     

     

    Par contre pour répondre à ta solution idéale je ferai la chose suivante:

    Code Snippet

    dataGridView1.CurrentCell=dataGridView1.Rows[0].Cells[0];

     

     

    Dans le load du form correspondant après que les données aient étés remplies (à la fin du load quoi )

     

    Ca sélectionnera la première cellule de la première ligne et donc la première ligne (CurrentRow étant read only CurrentCell permet de contourner facilement le problème de sélection d'une ligne)

     

    vendredi 16 mai 2008 08:31

Toutes les réponses

  • Bonjour,

     

    Bon week end?

     

    Les 2 seuls cas que j'ai rencontré jusqu'à maintenant sont (à mon souvenir):

    - la classe n'est pas déclarée publique (et tu utilises des namespaces différent ce qui ne doit pas être ton cas si je me souviens bien sauf si tu as mis ça dans une dll que tu appelles par exemple) [par défaut une classe est internal]

    - il y a une erreur dans la classe frmEnvoieEmail (comme elle ne compile pas l'intellisense ne peut rien te proposer).

     

    Bref essaye un petit F6 pour compiler et assure toi que frmEnvoieEmail n'a aucune erreur (warning). S'il n'y a rien poste la classe frmEnvoiEmail pour voir.

     

    mardi 13 mai 2008 09:48
  • frmEnvoieEmail

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using ComponentFactory.Krypton.Toolkit;

    using System.Net;

    using System.Net.Mail;

    using System.Net.Mime;

    using System.IO;

    using System.Text.RegularExpressions;

    using Microsoft.Office.Interop.Word;

    namespace CourtisKrypton

    {

    public partial class frmEnvoieEmail : ComponentFactory.Krypton.Toolkit.KryptonForm

    {

    private string _Destinataire;

    public string Destinataire

    {

    get { return _Destinataire; }

    set { _Destinataire = value; }

    }

    public frmEnvoieEmail()

    {

    InitializeComponent();

    }

    public void sendMail(object sender, EventArgs e)

    {

    //Définitions des données

    string Froms = "info@courtage.ch";

    string Subjects = txtSujet.Text;

    string msgAttachs = txtFichierJoint.Text;

    string Bodys = ltxtMessage.Text;

    System.Net.Mail.MailMessage emailclient = new System.Net.Mail.MailMessage();

    //Configuration

    emailclient.From = new MailAddress("" + Froms + "");

    emailclient.Subject = Subjects;

    emailclient.Body = Bodys;

    //Pièce jointe

    if (msgAttachs != "")

    {

    Attachment pieceJointeEmailClient = new Attachment(@"" + msgAttachs + "");

    emailclient.Attachments.Add(pieceJointeEmailClient);

    }

    SmtpClient envoieEmailClient = new SmtpClient();

    envoieEmailClient.Host = "mail.bluewin.ch";

    envoieEmailClient.Credentials = new NetworkCredential("h.berthoud", "clochard11");

    //envoie

    try

    {

    string[] mesdestinaires = txtDestinataire.Text.Split(',');

    Regex regEmail = new Regex("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)+$");

    for (int i = 0; i < mesdestinaires.Length; i++)

    {

    string strEmail = mesdestinairesIdea;

    Match monMatch = regEmail.Match(strEmail);

    if (!regEmail.IsMatch(strEmail))

    {

    MessageBox.Show("Adresse e-mail non valide: " + mesdestinairesIdea, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    else

    {

    emailclient.To.Add(new MailAddress("" + mesdestinairesIdea + ""));

    MessageBox.Show("Message envoyé avec succès", "Envoie message", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    }

    envoieEmailClient.Send(emailclient);

    }

    catch (SmtpException mesEx)

    {

    MessageBox.Show("Echec de l'envoie du message:" + mesEx.Message + "", "Envoie message", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    }

    private void button1_Click(object sender, EventArgs e)

    {

    frmEnvoieEmailAddDestinataire monDialogue = new frmEnvoieEmailAddDestinataire();

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

    {

    txtDestinataire.Text = monDialogue.Result;

    }

    }

    private void button2_Click(object sender, EventArgs e)

    {

    openFileDialog1.InitialDirectory = @"C:\";

    openFileDialog1.Title = "Selectionner un fichier";

    openFileDialog1.FileName = "";

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

    {

    txtFichierJoint.Text = openFileDialog1.FileName;

    etatFileJoint.Text = "Fichier joint avec succès";

    pictureSuccess.Visible = true;

    }

    else

    {

    etatFileJoint.Text = "Impossible d'attacher l'élément.";

    }

    }

    private void button4_Click(object sender, EventArgs e)

    {

    Microsoft.Office.Interop.Word._Application wordInstance = new Microsoft.Office.Interop.Word.Application();

    object missing = System.Reflection.Missing.Value;

    openFileDialog2.InitialDirectory = @"C:\";

    openFileDialog2.Title = "Selectionner un fichier";

    openFileDialog2.FileName = "";

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

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

    {

    try

    {

    object read_only = false;

    object visible = true;

    object ofalse = false;

    object otrue = true;

    object dynamic = 2;

    object oFileName = openFileDialog2.FileName;

    _Document doc = wordInstance.Documents.Open(ref oFileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

    //Les deux lignes suivantes prennent le contenu du document Word et le recopient dans la richtextbox

    doc.Content.Copy();

    ltxtMessage.Paste();

    }

    catch (Exception mtE)

    {

    MessageBox.Show("Impossible d'ouvrir le fichier:" + mtE.Message + "." + mtE.GetType() + ".", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    }

    wordInstance.Quit(ref missing, ref missing, ref missing);

    }

    private void button3_Click(object sender, EventArgs e)

    {

    if (txtDestinataire.Text != "")

    {

    sendMail(sender, e);

    }

    else

    {

    MessageBox.Show("Veuillez entrer un destinataire", "Erreur destinataire", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    }

    private void frmEnvoieEmail_Load(object sender, EventArgs e)

    {

    }

    }

    }

     

    J'ai passé un excellent week-end (LAN counter-strike xD), et toi?

    mardi 13 mai 2008 10:02
  • Bonjour,

     

    C'est tout à fait normal car dans le code suivant :

     

    Form frmEnvoieEmail = new frmEnvoieEmail();

     

    frmEnvoieEmail est de type From et nom de type frmEnvoieEmail...

    .NET ne reconnait donc pas votre propriété perso.

     

    Déclarez donc :

    Code Snippet
    frmEnvoieEmail frmEnvoieEmail;

     

     

    Cordialement

    mardi 13 mai 2008 10:57
    Modérateur
  • La référence d'objet n'est pas définis à une instance d'objet.

     

    Lorsque je clic sur e-mail, après avoir sélectionné une rows.

     

    me soules cette erreur -_-  !

     

    Merci pour ta réponse en tout cas ^^

    mardi 13 mai 2008 11:03
  • Bravo Gilles, elle m'a complètement échappée celle là! Le week end était trop cool  (LOTRO, films, promenade[fallait profiter du soleil quand même], ...)

     

    En fait ce que te proposait Gilles c'était de remplacer:

     

    Form frmEnvoieEmail = new frmEnvoieEmail();

    par

    frmEnvoieEmail frmEnvoieEmail = new frmEnvoieEmail();

    Il t'a pas remis l'appel au constructeur pour te montrer ce qui changeait mais si tu crées pas une instance tu obtiens effectivement un référence non définie:

    mets donc:

    Code Snippet

    frmEnvoieEmail frmEnvoieEmail = new frmEnvoieEmail();

     

     

     

    et ça fonctionnera.

     

    Par contre je pense être celui qui avait suggéré d'utiliser Form; mais là hors contexte je me rappelle pas dans quelque but donc il y aura peut être une effet de bord indésirable

    mardi 13 mai 2008 11:17
  • Salut,

     

    c'est ce que j'ai fais:

     

    private void button11_Click(object sender, EventArgs e)

    {

    frmEnvoieEmail frmEnvoieEmail = new frmEnvoieEmail();

    frmEnvoieEmail.Destinataire = (string)dataGridView1.CurrentRow.Cells["email"].Value;

    frmEnvoieEmail.Show();

    }

     

     

    Meilleure salutation

    mardi 13 mai 2008 11:25
  • Bonjour,

     

    Est ce au niveau de cette ligne que vous avez une problème ?

    Code Snippet
    frmEnvoieEmail.Destinataire = (string)dataGridView1.CurrentRow.Cells["email"].Value;

     

    Comment est alimenté votre DataGridView ?

     

    Cordialement

    mardi 13 mai 2008 14:40
    Modérateur
  • Bonjour,

     

    il semblerait que sa fonctionne maintenant, bien que je ne sache pas comment j'ai fais.

     

    Voici dans ma frmEnvoieEmail le code qui gère les destinataire:

     

    try

    {

    string[] mesdestinaires = txtDestinataire.Text.Split(',');

    Regex regEmail = new Regex("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)+$");

    for (int i = 0; i < mesdestinaires.Length; i++)

    {

    string strEmail = mesdestinairesIdea;

    Match monMatch = regEmail.Match(strEmail);

    if (!regEmail.IsMatch(strEmail))

    {

    MessageBox.Show("Adresse e-mail non valide: " + mesdestinairesIdea, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    else

    {

    emailclient.To.Add(new MailAddress("" + mesdestinairesIdea + ""));

    MessageBox.Show("Message envoyé avec succès", "Envoie message", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    }

    envoieEmailClient.Send(emailclient);

    }

    catch (SmtpException mesEx)

    {

    MessageBox.Show("Echec de l'envoie du message:" + mesEx.Message + "", "Envoie message", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

     

     

    Ma question est la suivante:

     

    Comment faire pour que si _Destinataire != null, txtDestinataire.Text aie en plus des destinataires de la boucle foreach, la valeur de _Destinataire?

     

     

    Gilles, vous avez oubliez de m'envoyer le tutoriel sur les interfaces, il est encore possible à yannick@bluesystem.ch Stick out tongue.

     

    Meilleures salutations !

    mercredi 14 mai 2008 06:54
  • pourquoi ne pas faire la chose suivante: remplace

    Code Snippet

    string[] mesdestinaires = txtDestinataire.Text.Split(',');

     

     

    par:

     

    Code Snippet

    string[] mesdestinaires;

    if (_Destinataire.Lenght>0)

    {

    string AllEmails = _Destinataire + ',' + txtDestinataire.Text

    mesdestinaires = AllEmails.Split(',');

    }

    else

    {

    mesdestinaires = txtDestinataire.Text.Split(',');

    }

     

     

    c'est pas optimal mais ça fonctionnera. Je vérifie que _Destinataire n'est pas null en vérifiant sa longueur; ensuite je le rajoute dans la chaine à splitter sinon j'effectue le traitement habituel.
    mercredi 14 mai 2008 07:20
  • Hello,

     

    Voici donc mon code:

     

    frm1:

     

    frmEnvoieEmail frmEnvoieEmail = new frmEnvoieEmail();

    frmEnvoieEmail.Destinataire = (string)dataGridView1.CurrentRow.Cells["email"].Value;

    frmEnvoieEmail.Show();

     

     

    frmEnvoieEmail

     

    //envoie

    try

    {

    string[] mesdestinaires;

    if (_Destinataire.Length>0)

    {

    string AllEmails = _Destinataire + ',' + txtDestinataire.Text;

    mesdestinaires = AllEmails.Split(',');

    }

    else

    {

    mesdestinaires = txtDestinataire.Text.Split(',');

    }

    Regex regEmail = new Regex("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)+$");

    for (int i = 0; i < mesdestinaires.Length; i++)

    {

    string strEmail = mesdestinairesIdea;

    Match monMatch = regEmail.Match(strEmail);

    if (!regEmail.IsMatch(strEmail))

    {

    MessageBox.Show("Adresse e-mail non valide: " + mesdestinairesIdea, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

    else

    {

    emailclient.To.Add(new MailAddress("" + mesdestinairesIdea + ""));

    MessageBox.Show("Message envoyé avec succès", "Envoie message", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    }

    envoieEmailClient.Send(emailclient);

    }

    catch (SmtpException mesEx)

    {

    MessageBox.Show("Echec de l'envoie du message:" + mesEx.Message + "", "Envoie message", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

     

     

    _Destinataire ne s'intègre pas dans txtDestinataire.txt et si j'ai pas sélectionner de rows dans form1 il n'a pas de valeur à passé a frmEnvoieEmail et donc fait une référence d'objet pas définis etc.

     

    Meilleures salutations

    mercredi 14 mai 2008 07:32
  • Je n'avais pas compris que tu voulais mettre à jour la textbox en fait.

    Bon j'ai re regardé ta classe et il y a quelques modifs à faire.

     

    Tout d'abord remets le code que je t'ai fait changer ce matin car ce n'est pas là que l'on doit agir.

     

    Il y a 2 choses à faire en suite:

     

    1 - initialiser le txtDestinataire avec la valeur de _Destinataire (je te conseille de le faire dans le set de la propriété.

    remplace:

    Code Snippet

    public string Destinataire

    {

    get { return _Destinataire; }

    set { _Destinataire = value; }

    }

     

     

    par:

    Code Snippet

    public string Destinataire

    {

    get { return _Destinataire; }

    set { _Destinataire = value;

    txtDestinataire.Text = _Destinataire;

    }

    }

     

     

    Note: Attention si tu refait un appel au set ailleurs dans le code cela te réinitialisera txtDestinataire (si cela devient le cas il faudra le prendre en compte)

     

    2- modifier button2 (celui qui permet de rajouter des destinaires) pour prendre en compte qu'il peut déjà y avoir des données

    remplace:

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    frmEnvoieEmailAddDestinataire monDialogue = new frmEnvoieEmailAddDestinataire();

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

    {

    txtDestinataire.Text = monDialogue.Result;

    }

    }

     

     

    par:

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    frmEnvoieEmailAddDestinataire monDialogue = new frmEnvoieEmailAddDestinataire();

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

    {

    if(txtDestinataire.Text =="")

    txtDestinataire.Text = monDialogue.Result;

    else

    txtDestinataire.Text += ',' +monDialogue.Result;

    }

    }

     

     

    Ici je vérifie qu'il n'y a rien et si le champ contient déjà des valeurs je rajoute la dernière arpès une virgule (au passage on aurait déjà du le faire auparavant mais tu n'as peut être jamais ajouté 2 destinataires pour découvrir le problème )

     

    mercredi 14 mai 2008 08:16
  • Salut,

     

    Je remonte ce poste car j'ai en effet un soucis:

     

    frmEnvoieEmail.Destinataire = (string)dataGridView1.CurrentRow.Cells["email"].Value;

     

     

    cette ligne figure dans mon bouton "email" de ma form1.

     

    Mais, si je clic sur le bouton et que cette ligne est de valeur null, il me donne une instance d'objet.

     

    Ce qui ne devrait pas puisque on est pas obliger d'avoir un client de sélectionner pour ouvrir la forme.

    jeudi 15 mai 2008 07:57
  • Bon ça mériterait un autre post je pense mais voici quelques pistes à explorer.

    Tout d'abord il va te falloir déterminer si c'est vide et remplacer ta ligne par (en pseudo code):

     

    Code Snippet

    if (la ligne n'est pas vide) 

    frmEnvoieEmail.Destinataire = (string)dataGridView1.CurrentRow.Cells["email"].Value;

     

     

     

    Bon pour déterminer que cette ligne n'est pas vide plusieurs solution (je n'ai pas suffisament de code sous la main pour te faire un exemple et valider mes réponse donc il va te falloir essayer)

    1- la plus simple (mais pas la plus propre): vérifie que (string)dataGridView1.CurrentRow.Cells["email"].Value contient un @ (string à une méthode Contains)

     

    2- normalement tu dois pouvoir déterminer qu'elle est vide à un certain niveau (encore que car tu n'as pas de crash te donnant une référence non définie). Le plus simple serait de mettre un point d'arrêt sur cette ligne et de regarder à chaque niveau (datagridView1.CurrentRow, datagridView1.CurrentRow.Celles["email"], datagridView1.selectIndex, ...). Ca devrait te permettre d'identifier le plus logique (je dirais selectedIndex)

     

    Faudrait se faire un peu de sharedView pour plus de détails mais je peux pas aujourd'hui.

     

    jeudi 15 mai 2008 13:32
  • "Faudrait se faire un peu de sharedView pour plus de détails mais je peux pas aujourd'hui."

     

    Fixons le a lundi 10h?

     

    Pour ta méthode, voici mon code:

     

    private void button11_Click(object sender, EventArgs e)

    {

    frmEnvoieEmail frmEnvoieEmail = new frmEnvoieEmail();

    if ((string)dataGridView1.CurrentRow.Cells["email"].Value != null)

    {

    frmEnvoieEmail.Destinataire = (string)dataGridView1.CurrentRow.Cells["email"].Value;

    }

    frmEnvoieEmail.Show();

    }

     

    erreur:

    Avertissement 1 'CourtisKrypton.frmEditClient.Name' masque le membre hérité 'System.Windows.Forms.Control.Name'. Utilisez le mot clé new si le masquage est intentionnel.

     

    Solution idéal:

     

    Au lancement de la form, il serait intéressant enfait que une row soit automatiquement sélectionnée, comme ça plus de problème xD

    vendredi 16 mai 2008 07:31
  • Hum ici l'erreur n'a rien à voir avec le code présent Je pense que tu as créé une propriété Name dans ton frmEditClient alors que c'est une propriété existante des Form. Change le nom de cette propriété pour éviter tout conflit ultérieur.

     

     

    Par contre pour répondre à ta solution idéale je ferai la chose suivante:

    Code Snippet

    dataGridView1.CurrentCell=dataGridView1.Rows[0].Cells[0];

     

     

    Dans le load du form correspondant après que les données aient étés remplies (à la fin du load quoi )

     

    Ca sélectionnera la première cellule de la première ligne et donc la première ligne (CurrentRow étant read only CurrentCell permet de contourner facilement le problème de sélection d'une ligne)

     

    vendredi 16 mai 2008 08:31