2017-09-21 3 views
1

J'ai un petit problème avec Datagrid.C# Datagrid envoyer des lignes dépend de la valeur de la cellule en HTML

Datagrid pris de SQL ->

MyDataGrid

Les principaux points sont:
- 1ère colonne avec le numéro,
- dernière colonne (8) par e-mail. Je voudrais envoyer en HTML corps via Outlook (table dans le corps) avec la liste des données des lignes, où la 1ère colonne (nombre) est la même, pour l'email qui est stocké sur 8ème. En boucle pour envoyer des informations groupées à chaque numéro.

Maintenant, j'utilise séparatelly row par email, mais j'ai besoin de config avec le groupe par valeur de la 1ère colonne (liste des lignes). Ci-dessous mon exemple:

con.Open(); 
String query = "xxxxxxxx"; 
SqlDataAdapter SDA = new SqlDataAdapter(query, con); 
DataTable dt = new DataTable(); 
SDA.Fill(dt); 
dataGridView1.DataSource = dt; 
con.Close(); 
for (int i = 0; i < DataGridView.Rows.Count; ++i) 
{ 
    1 = Convert.ToString(dataGridView1.Rows[i].Cells[1].Value); 
    2 = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value); 
    3 = Convert.ToString(dataGridView1.Rows[i].Cells[3].Value); 
    4 = Convert.ToString(dataGridView1.Rows[i].Cells[5].Value); 
    5 = Convert.ToDouble(dataGridView1.Rows[i].Cells[6].Value).ToString("N"); 
    6 = Convert.ToDouble(dataGridView1.Rows[i].Cells[7].Value).ToString("N"); 
    7 = Convert.ToDouble(dataGridView1.Rows[i].Cells[8].Value).ToString("N"); 
    Outlook.Application app = new Outlook.Application(); 
    Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem); 
    mailItem.Subject = "xxx" + 1 + "xxx" + 2 + "xxx"; 
    mailItem.To = "[email protected]"; 
    mailItem.HTMLBody = "aaaaaaaaa" + 1 + "bb: " + 2 + "vvvv." 
    mailItem.Importance = Outlook.OlImportance.olImportanceHigh; 
    mailItem.Display(false); 
    ((Outlook._MailItem)mailItem).Send(); 
} 


J'ai essayé déjà avec:

string mailBody = "<table width='100%' style='border:Solid 1px Black;'>"; 
foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    mailBody += "<tr>"; 
    foreach (DataGridViewCell cell in row.Cells) 
    { 
     mailBody += "<td style='color:blue;'>" + cell.Value + "</td>"; 
    } 
    mailBody += "</tr>"; 
} 
mailBody += "</table>"; 
mailItem.HTMLBody = mailBody; 


Mais dans ce style, je suis plein DataGrid dans un e-mail.
Pouvez-vous m'aider à faire cela?

+1

Malheureusement, il est pas tout à fait clair ce que vous essayez d'atteindre, ce que vous vivez actuellement, ou ce que vous avez essayé, parce que le code fourni est fragmenté et incomplet. –

+0

En bref - j'ai eu DataGrid. Je voudrais envoyer des informations qui sont dans les rangées aux courriels défindés. Le contenu de l'email devrait contenir des lignes de la base de données, mais "groupped" via la 1ère colonne. Donc, pour le numéro 1000130, nous envoyons toutes les lignes où 1000130 existe, dans un courriel. L'email est stocké sur la 8ème colonne. – Tom

Répondre

1

Try this ...

DataTable dt = dataGridView1.DataSource as DataTable; 
//assuming your first columns name is 1... 
var groups = dt.AsEnumerable().GroupBy(x => x["1"]); 

foreach (var group in groups) 
{ 
    // create your mailItem instance.... 

    string mailBody = "<table width='100%' style='border:Solid 1px Black;'>"; 

    List<string> mailsToSend = new List<string>(); 

    foreach (var row in group) 
    { 
     mailBody += "<tr>"; 

     mailItem.Recipients.add(row.ItemArray[7].toString()); 

     foreach (var cell in row.ItemArray) 
     { 
      mailBody += "<td style='color:blue;'>" + cell.ToString() + "</td>"; 

     } 
     mailBody += "</tr>"; 
    } 

    mailBody += "</table>"; 
    mailItem.HTMLBody = mailBody; 

    //Send your mail.... 
} 

Mise à jour

Vous pouvez créer une liste de courrier qui a mails uniques ...

foreach (var group in groups) 
{ 
    // create your mailItem instance.... 


    List<string> mailsToSend = new List<string>(); 

    string mailBody = "<table width='100%' style='border:Solid 1px Black;'>"; 

     foreach (var row in group) 
     { 
      mailBody += "<tr>"; 

      // if not in the list, simply add... 
      if (!mailsToSend.Contains(row.ItemArray[7].ToString())) 
      { 
      mailsToSend.Add(row.ItemArray[7].ToString()); 
      } 

      foreach (var cell in row.ItemArray) 
      { 
      mailBody += "<td style='color:blue;'>" + cell.ToString() + "</td>"; 
      } 
      mailBody += "</tr>"; 
    } 

    //fill your recipients from your mail list... 
    foreach (var mail in mailsToSend) 
    { 
     mailItem.Recipients.Add(mail); 
    } 

    mailBody += "</table>"; 
    mailItem.HTMLBody = mailBody; 

    //Send your mail.... 
} 

Mise à jour

Prenez juste 7 cellules ...

foreach (var cell in row.ItemArray.Take(7)) 
{ 
    mailBody += "<td style='color:blue;'>" + cell.ToString() + "</td>"; 
} 
+0

Fonctionne parfaitement! Question - Si j'ai dans un groupe 10 lignes, et tous les groupes internes ont toujours le même e-mail dans la 8ème colonne, pour ne pas envoyer 10 fois le même message au même email - je peux déplacer ce mailItem avant un foreach et devrait fonctionner? Ou quelque chose de plus? – Tom

+0

@Tom, j'ai mis à jour ma réponse.J'espère que ça aide ... – caner

+0

C'est très utile et améliore mes compétences et mes logiciels. Dernière question - la dernière colonne est e-mail, mais je ne voudrais pas envoyer d'adresse e-mail dans le corps de l'e-mail, car cela n'a aucun sens. Puis-je seulement faire comme "array - 1" ou simmilar? Pour mieux comprendre, je voudrais prendre toute la ligne, comme c'est, mais sans la dernière colonne dans le corps, mais j'ai besoin de cette colonne pour envoyer un courriel (pour prendre l'adresse e-mail). – Tom