【问题标题】:Having Issues creating a loop for HTML table in code and assigning cells for table在代码中为 HTML 表格创建循环并为表格分配单元格时遇到问题
【发布时间】:2013-08-26 00:29:59
【问题描述】:

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

【问题讨论】:

  • 您目前没有生成有效的 HTML,所有打开的标签都应该关闭,所有属性都应该正确引用。和现在一样,没有使用 String.Format,只会给出不必要的调用。

标签: sql vb.net


【解决方案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。阅读更多here。

【讨论】:

    【解决方案2】:

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

    没有声明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 cmets 的标记在 StackOverflow 上无法正常工作('在 cmets 末尾是为了解决这个问题)。

    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。 (双“”是在结果中只输出一个“)

    【讨论】:

    • 我实际上想要实现的是在其下方为每张图片提供图片和描述。我希望每行有 6 个单元格和无限行。我只是把交叉信息放在那里,但实际上我应该把 picid 和 picdescrip 也放在那里。
    • @user2709389:附上您想要在 Word 中实现的目标的示例图片,以帮助我们更好地了解您的要求。
    • 我想要达到的目标见上文。
    • 您应该编辑您的问题或发布 cmets,而不是编辑其他答案 ;) i.stack.imgur.com/cSEOp.jpg 您需要先创建布局,我会先在经典 HTML 中创建一个虚拟布局,然后应用代码当想要的布局清晰时生成。
    • 好的,我更新了代码,但计数器仍然存在问题。不是在一行上放置 5 个唯一图像,然后转到下一行并在该行上再放置 5 个唯一图像,而是添加 5 个相同图像,然后转到下一行并添加 5 个新图像集.如果它返回 10 个值,则有 10 行,每行都有相同的图像,而不是唯一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-10-07
    • 2021-07-16
    相关资源
    最近更新 更多