在代码中为HTML表创建循环并为表分配单元格时出现问题



我有一个数据源和一个表,它们是我在VB.net代码中用HTML创建的。我已经为表创建了单元格,但在为此创建多个单元格和计数器时遇到问题。我希望每行有六个单元格,并且不限制行数。我知道我必须添加一个计数器来记录我添加了多少单元格,但我不知道该怎么做。我的表也只有一个单元格,代码如下。请帮忙,让我知道我没有添加什么。

       Dim strTable as New StringBuilder()
    strTable.Append("<table Style='border:2;border-width: 1px;'>")
    For Each dr As DataRowView In dv
        Dim crossover As String = dr("CrossoverID").ToString()
        Dim picid As String = dr("Description").ToString()
        Dim picdescrip As String = dr("DesignColor").ToString()

        strTable.Append("<tr>")
        For i As Integer = 5 - 1 To 0 Step -1
            strTable.Append(String.Format("<td>'<a href=Breakdown.aspx?p=" + crossover + "'</a>"))
            strTable.Append(String.Format("<img src='Images/" + picid + ".png' width='100' height='100'<br/>"))
            strTable.Append(String.Format(picdescrip + "</td>"))

        Next
        strTable.Append("</tr>")
    Next
    strTable.Append("</table>")
    divTable.InnerHtml = Convert.ToString(strTable)
End Sub

以下行中的内容:

Dim strTable as New StringBuilder()
strTable.Append("<table Style='border:2;border-width: 1px;'>")
For Each dr As DataRowView In dv
    Dim crossover As String = dr("CrossoverID").ToString()
    Dim picid As String = dr("Description").ToString()
    Dim picdescrip As String = dr("DesignColor").ToString()

    strTable.Append("<tr>")
    For j As Integer = 0 To 4
        strTable.Append(String.Format("<td>{0}</td>"), crossover))
    Next
    strTable.Append("</tr>")
Next
strTable.Append("</table>")
divTable.InnerHtml = strTable

注意以下内容:

  1. 由于您可以有大量的行,所以更喜欢StringBuilder而不是字符串
  2. 我真的不认为你需要一个内部循环来构建你的TD。每行可能会填充6个不同的值,如picid、picdescription等。您只需通过一个StringBuilder.Append()调用添加它们
  3. 如果您在ASP.NET中执行此操作,那么最好将数据源直接分配给DataGrid并编写输出html。点击此处阅读更多信息

在你的例子中,我不明白为什么你需要跟踪单元格的数量,因为现在你只添加了一个带有交叉数据的单元格,而这个单元格是基于名称的,这意味着你需要键入它们。

没有strTable的声明,但表被添加了多次,下面是我要从以下开始的:

    ' If dv.Table.Rows.Count > 0 Then - Not needed since we will get no data from For Each '
    Dim sbTable as New System.Text.StringBuilder() ' Faster then concating many strings '
    For Each dr As DataRowView In dv
        Dim crossover As String = dr("CrossoverID").ToString()
        Dim picid As String = dr("Description").ToString()
        Dim picdescrip As String = dr("DesignColor").ToString()
        sbTable.Append("<tr><td>" & crossover & "</td></tr>") ' Add one line, Separate <tr>, <td> & data & </td>, </tr> to separate lines to add multiple cells '
    Next
    If sbTable.Length > 0 Then divTable.InnerHtml = "<table style=""border:2;border-width: 1px;"">" & sbTable.ToString() & "</table>"

如果添加多次,StringBuilder比String更快
使用&要在VB.NET中将字符串添加在一起,这将确保它是作为字符串而不是其他内容添加的。

编辑:好的,所以你想要一个网格,不清楚你想要如何输出,因为你的例子中生成的HTML无效,并且在几个地方被剪切掉了。但我还是要试一试。不幸的是,VB注释的标记在StackOverflow上不能正确工作(注释末尾的"将解决这个问题)。

Dim strTable as New StringBuilder()
Dim itmCounter As Integer = 0
Dim rowIsOpen As Boolean = False
For Each dr As DataRowView In dv
    Dim crossover As String = dr("CrossoverID").ToString()
    Dim picid As String = dr("Description").ToString()
    Dim picdescrip As String = dr("DesignColor").ToString()
    ' For every 5 items create a new row. '
    If itmCounter Mod 5 = 0 Then
        ' Since we want new row, first close any open row '
        If rowIsOpen Then strTable.Append("</tr>")
        ' Start a new row and mark row as open so we can keep track '
        strTable.Append("<tr>")
        rowIsOpen = True
    End If

    strTable.Append("<td><a href=""Breakdown.aspx?p=" & crossover & """>")
    strTable.Append("<img src=""Images/" + picid + ".png"" width=""100"" height=""100"" /><br />"))
    strTable.Append(picdescrip & "</a></td>")
    itmCounter += 1
Next
' Make sure we close any open rows '
If rowIsOpen Then strTable.Append("</tr>")
If sbTable.Length > 0 Then
    divTable.InnerHtml = "<table style=""border:2;border-width: 1px;"">" & _
        sbTable.ToString() & _
        "</table>"
End If

If itmCounter Mod 5 = 0 Then部分用于每5个项目关闭和打开一个新的tr。这是必要的,因为For Each dr是更改项目的原因。(而不是在同一项目上循环5次)

我还确保了HTML是有效的,但是你可能仍然想在值中添加某种htmlEncode,以确保没有错误的值生成无效的HTML。(双"表示结果中只输出一个")

最新更新