Email C#通过电子邮件发送GridView/DataTables

Email C#通过电子邮件发送GridView/DataTables,email,gridview,c#-2.0,Email,Gridview,C# 2.0,我正在尝试找到在电子邮件中发送GridView或DataTable的最佳方式 页面隐藏代码: protected void Page_Load(object sender, EventArgs e) { DataTable s1 = Sql.specificReportData(Convert.ToInt32(Session["userID"])); this.gv.DataSource = s1.DefaultView; this.gv.DataBind(); } 这会成功地生成并绑定数据,

我正在尝试找到在电子邮件中发送GridView或DataTable的最佳方式

页面隐藏代码:

protected void Page_Load(object sender, EventArgs e)
{
DataTable s1 = Sql.specificReportData(Convert.ToInt32(Session["userID"]));
this.gv.DataSource = s1.DefaultView;
this.gv.DataBind();
}
这会成功地生成并绑定数据,但如果我尝试将gv的内容添加到HTML编码的电子邮件中,则电子邮件的gv部分为空。我是否需要更改GridView以使其符合HTML?我找不到一个这样做的例子。谢谢你的帮助

编辑:回答Solairaya,他给出了更完整的例子,以及物体冲洗和处理。在两个答案上都做了标记,因为他们都有帮助

Try this (C#):
使用System.IO; 使用系统文本; 使用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)
{

}
试试这个

Try this (C#):
使用System.IO; 使用系统文本; 使用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)
{

}
页面隐藏代码

    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;
    }
页面代码

<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>



代码后面的页面

    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;
    }
页面代码

<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>




如何获取gv的内容?我尝试将gv转换为字符串,并将其连接到stringbuilder,后者用作电子邮件的内容。我没想到它会起作用,但我不确定gv在什么时候会呈现为HTML,或者哪种方式才是准备发送电子邮件的最佳方式。你是如何获取gv的内容的?我尝试将gv转换为字符串并将其连接到stringbuilder,后者被用作电子邮件的内容。我没想到它会起作用,但我不确定gv在什么时候会被呈现为HTML,或者哪种方式才是准备发送电子邮件的最佳方式。谢谢Pandiya。刚刚尝试了这个,但不幸的是电子邮件是空的。我调试了StringBuilder sb,当它返回时,它是空的。我要传递的Gridview肯定是渲染的,而不是空的。刚刚尝试了这个,但不幸的是电子邮件是空的。我调试了StringBuilder sb,当它返回时,它是空的。我要传递的Gridview肯定是渲染的,而不是Null。数据绑定对此重要吗?因为我已经在pageload上进行数据绑定了。当我在没有数据源和数据绑定的情况下运行时,代码sb的行为null,即使在向它传递gridview时,我知道其中包含数据,如果您将gridview与绑定的数据一起发送的话。无需再次绑定数据。只需渲染并返回它。首先在调试模式下检查gv是否包含结构和数据。当您调用GetHTML方法时,数据绑定对此重要吗?因为我已经在pageload上进行数据绑定了。当我在没有数据源和数据绑定的情况下运行时,代码sb的行为null,即使在向它传递gridview时,我知道其中包含数据,如果您将gridview与绑定的数据一起发送的话。无需再次绑定数据。只需渲染并返回它。首先在调试模式下检查gv是否包含结构和数据。当您调用GetHTML方法时。