2009-12-14 3 views
0

J'essaie de trouver le meilleur moyen d'envoyer un GridView ou DataTable dans un e-mail.C# Envoi de GridViews/DataTables par e-mail

page Derrière le code:

protected void Page_Load(object sender, EventArgs e) 
{ 
DataTable s1 = Sql.specificReportData(Convert.ToInt32(Session["userID"])); 
this.gv.DataSource = s1.DefaultView; 
this.gv.DataBind(); 
} 

Cela génère et lie les données avec succès, mais si je tente et ajouter le contenu de gv à un e-mail codé HTML puis la partie gv de l'e-mail est vide. Dois-je modifier le GridView pour qu'il soit conforme à HTML? Je ne peux pas trouver un exemple de la façon de le faire. Toute aide appréciée.

edit: A donné une réponse à Solairaya comme il a donné un exemple plus complet, ainsi que le rinçage et l'élimination des objets. Marqué deux réponses comme ils ont tous deux aidé

+0

Comment obtenez-vous le contenu de gv? –

+0

J'ai essayé de convertir gv en une chaîne de caractères et de la concaténer en un stringbuilder, qui a été utilisé comme contenu de l'email. Je ne m'attendais pas à ce que cela fonctionne, mais je ne savais pas à quel moment le gv serait rendu en HTML, ou même quelle serait la meilleure façon de le préparer pour l'emailing. – Alex

Répondre

4

page derrière le code

protected void Button1_Click(object sender, EventArgs e) 
    { 
     Label1.Text = getHTML(GridView1); 
    } 

    private string getHTML(GridView gv) 
    { 
     StringBuilder sb = new StringBuilder(); 
     StringWriter textwriter = new StringWriter(sb); 
     HtmlTextWriter htmlwriter = new HtmlTextWriter(textwriter); 
     gv.RenderControl(htmlwriter); 
     htmlwriter.Flush(); 
     textwriter.Flush(); 
     htmlwriter.Dispose(); 
     textwriter.Dispose(); 
     return sb.ToString(); 
    } 

    public override void VerifyRenderingInServerForm(Control control) 
    { 
     return; 
    } 

Code Page

<form id="form1" runat="server"> 
    <div> 
     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"> 
      <Columns> 
       <asp:BoundField DataField="UserID" HeaderText="UserID" SortExpression="UserID" /> 
       <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
       <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> 
      </Columns> 
     </asp:GridView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" 
      SelectCommand="SELECT [UserID], [Name], [Email] FROM [WEB_Users] WHERE ([Name] LIKE '%' + @Name + '%')"> 
      <SelectParameters> 
       <asp:Parameter DefaultValue="%Moha%" Name="Name" Type="String" /> 
      </SelectParameters> 
     </asp:SqlDataSource> 
     <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> 
     <br /> 
     <br /> 
     <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div> 
    </form> 
+0

est la liaison de données important pour cela? Comme je suis déjà databinding sur pageload. Quand je cours sans la source de données et les lignes de données du code sb est nul, même en passant un gridview à ce que je sais a des données dedans – Alex

+0

si vous envoyez le Gridview avec les données liées. Pas besoin de lier les données une fois de plus. Juste le rendre et le retourner. – solairaja

+0

vérifiez que le gv a la structure et les données dedans, en mode débogage d'abord. lorsque vous appelez la méthode GetHTML. – solairaja

1

Hai alex essayer,

Try this (C#): 

using System.IO; en utilisant System.Text; en utilisant System.Net.Mail;

private string GridViewToHtml(GridView gv) 
{ 
    StringBuilder sb = new StringBuilder(); 
    StringWriter sw = new StringWriter(sb); 
    HtmlTextWriter hw = new HtmlTextWriter(sw); 
    gv.RenderControl(hw); 
    return sb.ToString(); 
} 

protected void SendMailButton_Click(object sender, EventArgs e) 
{ 
    MailMessage mail = new MailMessage(); 
    mail.Body = GridViewToHtml(GridView1); 
    mail.IsBodyHtml = true; 
    ...... 
} 
public override void VerifyRenderingInServerForm(Control control) 
{ 

} 
+0

Merci Pandiya. Juste essayé ceci mais malheureusement l'email est vide. J'ai débogué et StringBuilder sb est vide quand il est passé. Le Gridview que je passe est certainement en train d'être rendu et non nul – Alex

+0

Alex donne l'essai à celui-ci http://fredrik.nsquared2.com/viewpost.aspx?PostID=412 –

-1

En cas stringbuilder ne le fait pas, essayez le code suivant:

protected void btnConfirmation_Click(object sender, EventArgs e) 
{ 
    int rowcount = 0; 
    foreach (GridViewRow row in GridView2.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      rowcount++; 
     } 
    } 

    string strHTML = "<html><STYLE='font-size: 12px;'>" + 
       "<body>" + 
       "<table border='1'>" + 
       "<thead>" + 
        "<tr>" + 
        "<th>OrderDetail ID</th>" + 
        "<th>Order ID</th>" + 
        "<th>User Name</th>" + 
        "<th>Product ID</th>" + 
        "<th>Quantity</th>" + 
        "<th>Unit Price</th>" + 
        "<th>Shipping Costs</th>" + 
        "</tr>" + 
       "</thead>"; 
    for (int a = 0; a < rowcount; a = a + 1) 
    { 
     strHTML = strHTML + "<tr>"; 
     for (int b = 0; b < 7; b = b + 1) 
      { 
       strHTML = strHTML + "<td>" + GridView2.Rows[a].Cells[b].Text + "</td>"; 
      } 
    } 
    strHTML = strHTML + "</tr></table>"; 
    strHTML = strHTML + "<br/><br/><br/>" + 
       "<table>" + 
       "<tr><td> Order ID <td/><td> " + GridView3.Rows[0].Cells[0].Text + 
       "<tr><td> Order Date <td/><td> " + GridView3.Rows[0].Cells[1].Text + 
       "<tr><td> User Name <td/><td> " + GridView3.Rows[0].Cells[2].Text + 
       "<tr><td> Firstname <td/><td> " + GridView3.Rows[0].Cells[3].Text + 
       "<tr><td> Lastname <td/><td> " + GridView3.Rows[0].Cells[4].Text + 
       "<tr><td> Address <td/><td> " + GridView3.Rows[0].Cells[5].Text + 
       "<tr><td> City <td/><td> " + GridView3.Rows[0].Cells[6].Text + 
       "<tr><td> State <td/><td> " + GridView3.Rows[0].Cells[7].Text + 
       "<tr><td> PostalCode <td/><td> " + GridView3.Rows[0].Cells[8].Text + 
       "<tr><td> Country <td/><td> " + GridView3.Rows[0].Cells[9].Text + 
       "<tr><td> Phone <td/><td> " + GridView3.Rows[0].Cells[10].Text + 
       "<tr><td> Email <td/><td> " + GridView3.Rows[0].Cells[11].Text + 
       "<tr><td> Total <td/><td> " + GridView3.Rows[0].Cells[12].Text + 
       "<tr><td> Payment Transaction ID <td/><td> " + GridView3.Rows[0].Cells[13].Text + 
       "<tr><td> Has Been Shipped <td/><td> " + GridView3.Rows[0].Cells[14].Text; 
    string strTo = "[email protected]"; 
    string strSubject = "Expedition."; 
    SendingMail(strHTML, strTo, strSubject); 
} 

protected void btnExpedition_Click(object sender, EventArgs e) 
{ 
    string Firstname = GridView3.Rows[0].Cells[3].Text; 
    string Lastname = GridView3.Rows[0].Cells[4].Text; 
    string Address = GridView3.Rows[0].Cells[5].Text; 
    string City = GridView3.Rows[0].Cells[6].Text; 
    string State = GridView3.Rows[0].Cells[7].Text; 
    string PostalCode = GridView3.Rows[0].Cells[8].Text; 
    string Country = GridView3.Rows[0].Cells[9].Text; 
    string strSpaces = "&#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32; &#32;"; 
    string html = "<!DOCTYPE html>" + 
        "<html lang='en'>" + 
        "<body><meta charset='utf-8' />" + 
        "<div><label>xxx</label></div>" + 
        "<div><label>xxxxxxxxxxxx</label></div>" + 
        "<div><label>xxxxxxxxxxxx</label></div>" + 
        "<div><label>xxxxxxx</label></div>" + 
        "<br/><br/>" + 
        "<div style='Font-size: 32px;'>" + 
        "<label>" + strSpaces + Firstname + " " + Lastname + "</label></div>" + 
        "<div style='Font-size: 32px;'>" + 
        "<label >" + strSpaces + Address + "</label></div>" + 
        "<div style='Font-size: 32px;'>" + 
        "<label>" + strSpaces + PostalCode + City + "</label></div>" + 
        "<div style='Font-size: 32px;'>" + 
        "<label>" + strSpaces + Country + "</label></div>" + 
        "</body>" + 
        "</html>"; 
    string strTo = "[email protected]"; 
    string strSubject = "Expedition."; 
    SendingMail(html, strTo, strSubject); 

} 

protected void SendingMail(string strHTML, string strTo, string strSubject) 
{ 
    MailAddress from = new MailAddress("[email protected]"); 
    MailAddress to = new MailAddress(strTo); 
    System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage(from, to); 
    mail.Subject = strSubject; 

    mail.IsBodyHtml = true; 

    string url = HttpContext.Current.Request.Url.AbsoluteUri; 
    mail.Body = strHTML; 
    SmtpClient smtp = new SmtpClient(); 
    smtp.Host = "smtp.xxxx.xxx"; 
    smtp.Port = 587; 

    smtp.Credentials = new NetworkCredential("[email protected]", "xxx5Qq"); 
    smtp.EnableSsl = true; 

    smtp.Send(mail); 

} 

Tables:

tables

Mail:

mail