У меня есть базовая настройка HTML-таблицы на моем веб-портале ASP.NET:
<table ID = "MasterTable" width = "100%" style = "border: 1px solid gray;">
<tr>
<th style = "border: 1px solid gray;" width = "33%">
Promo Master ID
</th>
<th style = "border: 1px solid gray;" width = "33%">
Name
</th>
<th style = "border: 1px solid gray;" width = "33%">
PLU
</th>
</tr>
ПРИМЕЧАНИЕ. Есть закрывающий тег таблицы, там был просто дополнительный код, не связанный с ним.
Мне было интересно, как я могу заполнить таблицу данными, сохраненными в базе данных SQL Server.
cmd = New SqlCommand("SELECT PromoMasterID, Description, PLU FROM PromoMaster")
cmd.Connection = conn
conn.Open()
Является ли то, что у меня есть для вызова, а PromoMasterID, Описание, PLU — это то, что я хочу в качестве столбцов, как я могу использовать это для заполнения таблицы?
Любая помощь будет оценена по достоинству, спасибо.
Что ж, вы можете заполнить HTML-таблицу, но здесь у вас есть «ох как» много лучших вариантов.
Однако, к вашему сведению, если вы пометите элемент управления (таблицу) с помощью runat="server", то код теперь сможет свободно манипулировать этим объектом таблицы HTML.
Следовательно, произнесите эту разметку:
<table ID = "Hotels" runat = "server"
style = "width:30%" class = "table table-hover table-bordered table-striped" >
<tr>
<th style = "border: 1px solid gray;" width = "33%">
Hotel Name
</th>
<th style = "border: 1px solid gray;" width = "33%">
Description
</th>
</tr>
</table>
Итак, наш код может быть таким:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadTable
End If
End Sub
Sub LoadTable()
Dim strSQL =
"SELECT HotelName, Description FROM tblHotels
ORDER BY HotelName"
Dim dtHotels As DataTable = MyRst(strSQL)
For Each OneRow As DataRow In dtHotels.Rows
Dim NewRow As New HtmlTableRow()
Dim HotelName As New HtmlTableCell()
HotelName.InnerText = OneRow("HotelName").ToString
Dim Description As New HtmlTableCell()
Description.InnerText = OneRow("Description").ToString
NewRow.Cells.Add(HotelName)
NewRow.Cells.Add(Description)
Hotels.Rows.Add(NewRow)
Next
End Sub
И результат такой:
И обратите внимание на настройку класса для таблицы (это загрузочные классы, поэтому результирующая таблица выглядит довольно красиво).
Однако гораздо лучше использовать элемент управления GridView, поскольку он учитывает данные и в любом случае выходными данными будет таблица HTML.
Итак, вместо вышесказанного, используя GridView, мы имеем следующую разметку:
<asp:GridView ID = "GHotels" runat = "server"
style = "width:30%" CssClass = "table table-hover table-striped">
</asp:GridView>
И наш код теперь становится таким:
Sub LoadTable()
Dim strSQL =
"SELECT HotelName, Description FROM tblHotelsA
ORDER BY HotelName"
Dim dtHotels As DataTable = MyRst(strSQL)
GHotels.DataSource = dtHotels
GHotels.DataBind()
End Sub
Итак, обратите внимание, как мало кода требуется для приведенного выше примера. И даже обратите внимание, что нам не пришлось выписывать имена столбцов выше.
Результат вышесказанного таков:
Итак, разве вы не собираетесь писать всевозможный дополнительный код? Я не вижу особых причин использовать таблицу HTML в отличие от использования элемента управления, «осведомленного о данных», такого как GridView, который в конце дня все равно выведет действительную разметку таблицы HTML.
И чтобы завершить этот пост, я использовал удобную «вспомогательную» процедуру под названием MyRst, которую я поместил в модуль глобального кода (поскольку быстро устаешь снова и снова вводить код соединения и таблицы данных). Эта процедура просто возвращает таблицу данных.
Итак, MyRst это:
Public Function MyRst(strSQL As String) As DataTable
' general get any data from SQL
Dim rstData As New DataTable
Using conn As New SqlConnection(My.Settings.TEST4)
Using cmdSQL As New SqlCommand(strSQL, conn)
conn.Open()
rstData.Load(cmdSQL.ExecuteReader)
rstData.TableName = strSQL
End Using
End Using
Return rstData
End Function
Конечно, если вы собираетесь вводить параметры в SQL, то я бы использовал MyRstP вот так:
Dim strSQL =
"SELECT * FROM tblHotels WHERE City = @City"
Dim cmdSQL As New SqlCommand(strSQL)
cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = "Edmonton"
Dim rstData As DataTable = MyRstP(cmdSQL)
Итак, MyRstP таков:
Public Function MyRst(strSQL As String) As DataTable
' general get any data from SQL command object
Dim rstData As New DataTable
Using conn As New SqlConnection(My.Settings.TEST4)
Using cmdSQL As New SqlCommand(strSQL, conn)
conn.Open()
rstData.Load(cmdSQL.ExecuteReader)
rstData.TableName = strSQL
End Using
End Using
Return rstData
End Function
Итак, обратите внимание, что циклический код не требуется, и, таким образом, обратите внимание, что у нас очень мало строк разметки и очень мало строк кода. Следовательно, практически нет причин идти по этому пути, используя все виды дополнительного зацикленного кода и всевозможную дополнительную HTML-разметку.
Почему? Если нет параметров и пользовательского ввода, то с кодом все в порядке. Если требуются параметры, я использую MyRstP. Я опубликую копию этого в этом примере. - см. мое редактирование. Так что тут вообще ничего не поощряем....
Однако, в качестве предупреждения, я все еще ОЧЕНЬ ценю это предложение и НЕ поощрять людей писать код внедрения SQL. Итак, я все равно благодарю вас за ваш комментарий, и, как видите, я не только согласен с вами, но и отредактировал пост. Хорошего дня!
Метод
MyRst()
заставит их писать код, который безумно уязвим для SQL-инъекций.