2016-09-29 4 views
2

Ich möchte HTML-Tabelle anstelle von Gridview verwenden, um die Daten zu fechten. Warum HTML-Tabelle? Da ich die Ausgabe für das Senden per E-Mail verwenden werde, bevorzuge ich HTML Table statt Gridview. Ich möchte auch kein Objekt verwenden, da das System nur auf dem Server läuft. Es wird automatisch eine E-Mail gesendet. Kann mir jemand bei meinem Problem helfen? Vielen Dank.Verwenden Sie HTML-Tabelle anstelle von Gridview

Hier ist was ich bisher habe. Im folgenden Beispiel verwende ich gridview, weil ich nicht weiß, wie man HTML Table mit Append benutzt.

Vb.Net

Dies ist, wie ich meine Funktion

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

Dieser Aufruf ist meine E-Mail-Funktion, die ich möchte in HTML-Tabelle umgewandelt werden mit anhängen.

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 

Der Code funktioniert, aber nicht so, wie ich es möchte. Ich möchte keine Gridview verwenden. Ich möchte es in HTML-Tabelle wie:

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

Jede Hilfe würde sehr geschätzt werden! :) Danke.

+0

Dies ist eine falsche Gegenteil. Ein GridView ist ein serverseitiges Steuerelement, das eine HTML-Tabelle rendern kann. Mit anderen Worten, es kann tun, was Sie fragen, ohne dass Sie HTML schreiben müssen.Alle fancy Optionen (wie Paginierung) ausschalten, ihm einige Spaltendefinitionen geben und voila. –

Antwort

1

Als Option können Sie Run-Time Text Template verwenden, um eine E-Mail-Vorlage zu erstellen. Auf diese Weise können Sie einfach ein Modell zum Generieren von Ausgaben mithilfe einer Vorlage verwenden. Es ist wie das, was Sie mit ASP.NET MVC und Razor Engine tun können, aber es ist nicht auf MVC oder sogar ASP.NET beschränkt. Sie können diese Idee überall dort verwenden, wo Sie eine Vorlage erstellen müssen.

Laufzeittextvorlage funktioniert wie eine Aspx-Seite. Für jemanden, der ASP.NET mit t4-Vorlagen kennt, ist es wirklich einfach. Es verwendet Anweisungen und Tags und Sie mischen Inhalt und Code. Sie verwenden Code, um die Ausgabe dynamisch zu machen. Dann rendert es den Inhalt, wenn Sie seine TransformText Methode aufrufen. Sie können einen beliebigen Typ als Model verwenden. Das Modell kann eine Ihrer Business- oder Ansichtsmodellklassen sein oder es kann eine DataTable sein.

Beispiel

eine neue Klasse zu einem Projekt hinzufügen:

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

eine neue Laufzeit-Textvorlage hinzufügen und benennen Sie es Mailtemplate (die auch als vorverarbeiteten Vorlage bekannt ist). Dann legen Sie diesen Inhalt der Datei:

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

Mit diesem Code-Ausgabe zur Laufzeit generieren:

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

Jetzt können Sie verwenden, um Ausgaben E-Mail senden oder schreiben Sie es auf Antwort.

wäre das Ergebnis:

enter image description here

+0

Leider habe ich vergessen zu erwähnen, dass ich keine Objekt- oder Frontend-Codierung verwenden darf. Ich muss das alles am Ende tun. Haben Sie eine Idee, wie Sie es erreichen können? –

+0

Es ist vollständig Server-basierte Codierung. Wie ich bereits in der Antwort erwähnt habe, können Sie jede Art von Modell verwenden, einschließlich einer 'DataTable'. Es ist eine wirklich nützliche Technik, die in jeder Art von Anwendungen verwendet werden kann, um Dinge wie E-Mail-Vorlagen zu haben. –

+0

Entschuldigung, aber ich bin nicht vertraut damit. Ich weiß nicht, wie ich deinen Vorschlag mit meinen Codes zusammenführen werde. Können Sie mir bitte ein Beispiel mit meinem Code geben? Vielen Dank. –

Verwandte Themen