2013-10-08 141 views
2

我正在开发一个在线订购Web应用程序,我必须通过电子邮件向客户发送产品详细信息。我有保持在一个数据表中的所有数据,然后务实地生成网格视图如下如何通过格式化发送电子邮件中的gridview

public GridView makeGridview(DataTable Dt) 
     { 
      GridView GV = new GridView(); 
      GV.DataSource = Dt; 
      GV.DataBind(); 
      return GV; 
     } 

然后加入这一网格视图以电子邮件

body = body.Replace("{Product_Details}", GridViewToHtml(makeGridview(Dt))); 

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(); 
     } 

这是工作正常,但问题是,然后我无法按照我们的预定义格式进行设计。此邮件将由我的网站的客户收到,所以我需要将其转换为我们的邮件。 请指导我如何格式化他们。

如果还有另一种方法可以做到这一点,那么我对此也是开放的。

+0

导出HTML表格('RenderControl')并发送 –

回答

0

关注follwing代码:

public void SendHTMLMail() 
{ 
MailMessage Msg = new MailMessage(); 
MailAddress fromMail = new MailAddress("[email protected]"); 
// Sender e-mail address. 
Msg.From = fromMail; 
// Recipient e-mail address. 
Msg.To.Add(new MailAddress("[email protected]")); 
// Subject of e-mail 
Msg.Subject = "Send Gridivew in EMail"; 
Msg.Body += "Please check below data <br/><br/>"; 
Msg.Body += GetGridviewData(gvUserInfo); 
Msg.IsBodyHtml = true; 
string sSmtpServer = ""; 
sSmtpServer = "10.2.160.101"; 
SmtpClient a = new SmtpClient(); 
a.Host = sSmtpServer; 
a.EnableSsl = true; 
a.Send(Msg); 
} 
// This Method is used to render gridview control 
public string GetGridviewData(GridView gv) 
{ 
StringBuilder strBuilder = new StringBuilder(); 
StringWriter strWriter = new StringWriter(strBuilder); 
HtmlTextWriter htw = new HtmlTextWriter(strWriter); 
gv.RenderControl(htw); 
return strBuilder.ToString(); 
} 

请参考下doccument:

http://www.aspdotnet-suresh.com/2012/09/how-to-send-gridview-in-email-body-in.html

1

我建议你不信任的GridView为您呈现的HTML,而是使用您当前的数据源(DataTable):

public GridView CreateHtmlTable(DataTable dt) 
    { 
     //Do your HTML work here, like the following: 
     string tab = "\t"; 

     StringBuilder sb = new StringBuilder(); 

     sb.AppendLine("<html>"); 
     sb.AppendLine(tab + "<body>"); 
     sb.AppendLine(tab + tab + "<table>"); 

     // headers. 
     sb.Append(tab + tab + tab + "<tr>"); 

     foreach (DataColumn dc in dt.Columns) 
     {   
     sb.AppendFormat("<td>{0}</td>", dc.ColumnName);   
     } 

     sb.AppendLine("</tr>"); 

     // data rows 
     foreach (DataRow dr in dt.Rows) 
     { 
        sb.Append(tab + tab + tab + "<tr>"); 

    foreach (DataColumn dc in dt.Columns) 
    { 
     string cellValue = dr[dc] != null ? dr[dc].ToString() : ""; 
     sb.AppendFormat("<td>{0}</td>", cellValue); 
    } 

    sb.AppendLine("</tr>"); 
} 

     sb.AppendLine(tab + tab + "</table>"); 
     sb.AppendLine(tab + "</body>"); 
     sb.AppendLine("</html>"); 
    } 
0

老实说,你在这里所做的(将Web窗体控件渲染为电子邮件字符串)看起来有点意外。老实说,遍历集合并使用StringBuilder构建HTML表格并不难。

我相信对于电子邮件HTML,约定通常使用内联样式来保证与电子邮件客户端的最佳兼容性。所以,你会想你的风格元素,像这样:

<table> 
    <tbody> 
    <tr style="background-color: #EE0000"> 
     <td style="text-transform: uppercase"></td> 
     ... 
    </tr> 
    </tbody> 
</table> 

在过去,我已经通过创建的一切,一个HTML文件,我怎么想它,并使用像{VariableName}占位符,然后做一个字符串替换上做到了这一点变量与它们的值。这样您可以将HTML视图与C#代码分开。这对于项目列表会有点棘手,在这种情况下,您至少需要两个HTML模板:一个用于整个文档,一个用于项目行。

相关问题