使用HTML表格而不是Gridview

使用HTML表格而不是Gridview

问题描述:

我想使用HTML表格而不是gridview来检查数据。为什么HTML表格?因为我将使用输出发送电子邮件,所以我更喜欢HTML表格而不是gridview。另外我不想使用对象,因为系统只能在服务器上运行。它会自动发送一封电子邮件。任何人都可以帮我解决我的问题吗?谢谢。使用HTML表格而不是Gridview

这是我到目前为止。在下面的例子中,我使用了gridview,因为我不知道如何使用Append来使用HTML Table。

Vb.Net

这是我打电话给我的功能

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
     SendEmail() 
End Sub 

这是我想转换为使用追加HTML表我的电子邮件功能。

Protects Sub SendEmail() 
    For Each dt As System.Data.DataTable In prod3() 
      Dim i As Integer = i + 1 
      Dim dv As New System.Data.DataView(dt) 
      Dim dt2 As System.Data.DataTable = dv.ToTable(False, {"Name", "Product", "Expiry"}) 
      Dim y As Date = dt.Rows(0)("pdate") 
     Dim dte1, dte2, dte3 As String 

      Select Case i 
       Case 1 
        dte1 = dt.Rows(0)("pdate").ToString 
        dte1 = y.Date.ToString("MM/dd/yyyy") 
        dte1 = y 
        GridView11.DataSource = dt2 
        GridView11.DataBind() 
       Case 2 
        dte2 = dt.Rows(0)("pdate").ToString 
        dte2 = y.Date.ToString("MM/dd/yyyy") 
        dte2 = y 
        GridView12.DataSource = dt2 
        GridView12.DataBind() 
       Case 3 
        dte2 = dt.Rows(0)("pdate").ToString 
        dte2 = y.Date.ToString("MM/dd/yyyy") 
        dte2 = y 
        GridView13.DataSource = dt2 
        GridView13.DataBind() 
      End Select 

     Next 
End SUb 

Public Function prod3() As List(Of DataTable) 

     Dim ds As New DataSet 
     Dim cmd As New SqlCommand 
     Dim ldt As New List(Of DataTable) 
     Dim adp As SqlDataAdapter = New SqlDataAdapter 
     Dim c As New SqlConnection("myconnection") 
     cmd.Connection = c 
     cmd.CommandText = "storedprocname" 
     cmd.Parameters.AddWithValue("@name", "%") 
     cmd.Parameters.AddWithValue("@product", "%") 
     cmd.Parameters.AddWithValue("@expiry", "%") 
     cmd.Parameters.AddWithValue("@datefrom", DateTime.Today.AddDays(1)) 
     cmd.Parameters.AddWithValue("@dateto", DateTime.Today.AddDays(3)) 
     cmd.Parameters.AddWithValue("@cost", "%") 
     cmd.CommandType = CommandType.StoredProcedure 
     adp.SelectCommand = cmd 
     adp.Fill(ds) 
     Dim dv As New DataView(ds.Tables(0)) 
     Dim dvfilter As DataTable = dv.ToTable(True, {"pdate"}) 
     For Each dtrow As DataRow In dvfilter.Rows 
      Dim dt2 As New DataTable 
      dv.RowFilter = "date =#" + dtrow("pdate") + "#" 
      dt2 = dv.ToTable(False, {"DATE", "Name", "Product", "Expiry"}) 
      ldt.Add(dt2) 
     Next 
     Return ldt 
    End Function 

该代码正在工作,但不是我想要的方式。我不想使用gridview。我希望它是在HTML表格,如:

Dim builder As New StringBuilder 
     builder.Append("<!DOCTYPE html><html>") 
     builder.Append("<head>") 
     builder.Append("</head>") 
     builder.Append("<body>") 
     builder.Append("<table>") 
     builder.Append("</table>") 
     builder.Append("<body>") 

任何帮助将不胜感激! :) 谢谢。

+0

这是一个错误的对面。 GridView是一个可以呈现HTML表格的服务器端控件。换句话说,它可以做你所要求的,而不必写HTML。关闭所有花哨的选项(如分页),给它一些列定义,瞧。 –

作为一个选项,您可以使用Run-Time Text Template来创建电子邮件模板。通过这种方式,您可以简单地使用模板来使用模板生成输出。这就像使用ASP.NET MVC和Razor引擎可以做的一样,但它不仅限于MVC甚至ASP.NET。无论您需要创建模板,您都可以使用这个想法。

运行时文本模板的工作方式类似于aspx页面。对于使用t4模板了解ASP.NET的人来说确实很容易。它使用指令和标签,并混合内容和代码。您使用代码来使输出动态。然后在您调用其方法TransformText时呈现内容。

您可以使用任何类型作为Model。该模型可以是您的业务或视图模型类中的一个,也可以是DataTable

添加一个新类到您的项目:

Public Class Product 
    Public Property Name As String 
    Public Property Price As Integer 
End Class 

添加一个新的运行时文本模板(也称为预处理的模板),并将其命名为MailTemplate。然后把这个内容的文件:

<#@ template language="VB" #> 
<#@ assembly name="System.Core" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Text" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ parameter type="System.Collections.Generic.List(Of Product)" name="Model"#> 
<html> 
<head> 
    <title>Products</title> 
    <style type="text/css"> 
     body { font-family: Calibri;width:400px;} 
     table { text-align:center; } 
     .container {width:400px;} 
    </style> 
</head> 
<body> 
<div class="container"> 
<h1 style="text-align:center;">List of Recent Products</h1><hr/> 
Here is list of recent products: 
<table style="width:100%"> 
    <tr><th>Index</th><th>Name</th><th>Price</th></tr> 
    <# Dim index As Integer = 1 
     For Each item in Model 
    #> 
    <tr> 
     <td><#=index#></td> 
     <td><#=item.Name#></td> 
     <td><#=item.Price#></td> 
    </tr> 
    <#  index = index + 1 
     Next 
    #> 
</table> 
<div> 
</body> 
</html> 

使用此代码在运行时产生的输出:

Dim template As New My.Templates.MailTemplate 
template.Session = New Dictionary(Of String, Object) 
Dim model = New List(Of Product)() 
model.Add(New Product With {.Name = "Product 1", .Price = 100}) 
model.Add(New Product With {.Name = "Product 2", .Price = 100}) 
model.Add(New Product With {.Name = "Product 3", .Price = 100}) 
template.Session("Model") = model 
template.Initialize() 
Dim output = template.TransformText() 

现在你可以使用输出到发送电子邮件或把它写入响应。

其结果将是:

enter image description here

+0

抱歉忘了提及我不允许使用对象或前端编码。我需要在后台完成这一切。你有想法如何实现它? –

+0

它完全基于服务器编码。正如我在答案中提到的那样,您可以使用任何类型的模型,包括“DataTable”。这是一个非常有用的技术,可以应用于任何类型的应用程序,以获得诸如电子邮件模板之类的东西。 –

+0

抱歉,但我不熟悉这一点。我不知道如何将您的建议与我的代码合并。你能用我的代码给我一个样本吗?谢谢。 –