顾名思义我试图在数据表中对行进行分组。为了进一步详细说明,除了一个字段(列)之外,该表具有相同的行。基本上我要做的是将相同行的所有不同字段放在单个字段中,同时删除其他行。
以下是我目前使用的语法
Dim i As Integer
Dim j As Integer
For i = 0 To (ds.Tables(0).Rows.Count() - 1) Step 1
If (i < ds.Tables(0).Rows.Count()) Then
roleHtml = "<table><tr><td>" + ds.Tables(0).Rows(i).Item("roleName") + "</td></tr>"
For j = (ds.Tables(0).Rows.Count() - 1) To 0 Step -1
If (ds.Tables(0).Rows(i).Item("UserName") = ds.Tables(0).Rows(j).Item("UserName")) And (ds.Tables(0).Rows(i).Item("roleName") IsNot ds.Tables(0).Rows(j).Item("roleName")) Then
roleHtml += "<tr><td>" + ds.Tables(0).Rows(j).Item("roleName") + "</td></tr>"
ds.Tables(0).Rows.Remove(ds.Tables(0).Rows(j))
i -= 1
End If
Next j
roleHtml += "</table>"
ds.Tables(0).Rows(i).Item("roleName") = roleHtml
End If
Next i
问题是当删除它们的索引发生变化的行时,基本上该字段会被抛出到与它无关的另一行。
答案 0 :(得分:1)
好吧,我可以帮助完成循环结构。这与你正在做的完全匹配(它保持表完整,只是构建一个大字符串,并假设表以特定方式排序),但它将使用您的实际数据演示经典的控制中断处理。为此,表需要按用户排序,然后按角色排序。
Dim i As Integer = 0
Dim CurUser As String = ""
Dim CurRole As String = ""
Dim result As new StringBuilder()
Dim r as DataRowCollection = ds.Tables(0).Rows
While i < r.Count
'Next User:'
CurUser = r(i)("UserName")
result.AppendFormat("<h2>{0}</h2>", CurUser).AppendLine()
result.AppendLine("<table>")
While i < r.Count AndAlso CurUser = r(i)("UserName")
'Next Role:'
CurRole = r(i)("roleName")
result.AppendFormat("<tr><td>{0}</td></tr>", CurRole).AppendLine()
While i < r.Count AndAlso CurUser = r(i)("UserName") AndAlso CurRole = r(i)("roleName")
i += 1 'Next Record: same user, role '
End While
'Finished this role'
End While
'Finished this user:'
result.AppendLine("</table>").AppendLine()
End While
这有 3 嵌套循环,而不仅仅是你的两个。但是,它仍然具有线性性能:它只会迭代每个记录一次。它的工作原理是因为所有循环共享同一个计数器,它只在内部循环中递增,并且它们都具有相同的基本结束条件。
答案 1 :(得分:0)
我最近必须使用control-break样式报告做类似的事情。
我结束了将数据绑定到转发器控件,其中项模板只是一个文字控件。然后我处理了OnItemDataBound事件,并且代码与你的模糊地相似,只要“控制”(在控制 - 中断意义上而不是web控制感)列匹配,只需将剩余列的值添加到类中-level变量并将e.Item.Visible设置为false。当它们不再匹配时,我将e.Item.Visible保留为true(默认值),并将文字控件的Text属性设置为我正在处理的行所需的html。
我确信有更好的方法可以做到这一点,但是使用asp.net查找控制中断报告信息并不容易:control
字在这个域中搜索时有双重含义很难克服。
答案 2 :(得分:0)
这很难读,这通常意味着它已经准备好进行重组了。
你能概述一下你想要达到的目标吗?您想在DataTable中留下什么?
数据是否已排序或您可以在数据库中执行此操作吗?如果它已经排序,那么你只需要通过一个循环。
我会做以下事情:
这解决了从您正在逐步执行的集合中删除行的问题。
答案 3 :(得分:0)
显然我的代码很有效。线i - = 1是额外的。很抱歉造成任何不便并感谢您的帮助
答案 4 :(得分:0)
循环部分看起来已被覆盖。
但是如果你没有意识到诀窍是从下往上工作(或者从最后一个元素到另一个元素),那么在循环时选择性地(或全部)删除项目可能会变得非常讨厌首先,或者你想要用它来表达它)。
这是问题删除部分的完整答案。
当您从上到下工作时,删除编号列表中的项目只会影响您已经处理的项目的索引 - 那么谁在乎呢,对吗?
-T。