0

我有一个数据源和一个在 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
4

2 回答 2

1

以下几行:

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。在这里阅读更多。
于 2013-08-26T00:41:18.410 回答
0

在您的示例中,我不明白为什么您需要跟踪单元格的数量,因为现在您只需添加一个带有交叉数据的单元格,并且该单元格是基于名称的女巫,这意味着您需要输入它们.

没有声明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零件用于tr每 5 个项目关闭和打开一个新项目。这是需要的,因为这是For Each dr更改项目的原因。(而不是在同一个项目上循环 5 次)

我还确保了 HTML 是有效的,但是您可能仍希望将某种 htmlEncode 添加到值中,以确保不会从不正确的值生成无效的 html。(双“”是在结果中只输出一个“)

于 2013-08-26T00:50:30.390 回答