あなたの例では、セルの数を追跡する必要がある理由がわかりません。クロスオーバーからのデータを含むセルを 1 つだけ追加するためです。セルは名前ベースの魔女であるため、それらを入力する必要があります。 .
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 で文字列を一緒に追加します。これにより、他のものではなく、文字列として追加されます。
編集: OK グリッドが必要です。例で生成された 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
このパーツは、5つのアイテムごとIf itmCounter Mod 5 = 0 Then
に新しいアイテムを開閉するために使用されます。アイテムを変更するものtr
であるため、これが必要です。For Each dr
(同じアイテムを 5 回ループする代わりに)
HTML が有効であることも確認しましたが、何らかの htmlEncode を値に追加して、不正な値から無効な html が生成されないようにすることもできます。(二重の "" は、結果に "" を 1 つだけ出力することです)