在VB asp.net 2.0中对数据表的行进行分组

时间:2008-12-12 14:56:11

标签: .net vb.net datatable

顾名思义我试图在数据表中对行进行分组。为了进一步详细说明,除了一个字段(列)之外,该表具有相同的行。基本上我要做的是将相同行的所有不同字段放在单个字段中,同时删除其他行。

以下是我目前使用的语法

   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

问题是当删除它们的索引发生变化的行时,基本上该字段会被抛出到与它无关的另一行。

5 个答案:

答案 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保留为t​​rue(默认值),并将文字控件的Text属性设置为我正在处理的行所需的html。

我确信有更好的方法可以做到这一点,但是使用asp.net查找控制中断报告信息并不容易:control字在这个域中搜索时有双重含义很难克服。

答案 2 :(得分:0)

这很难读,这通常意味着它已经准备好进行重组了。

你能概述一下你想要达到的目标吗?您想在DataTable中留下什么?

数据是否已排序或您可以在数据库中执行此操作吗?如果它已经排序,那么你只需要通过一个循环。

我会做以下事情:

  • 对数据表进行排序
  • 为结果制作新的数据表
  • 按顺序单步执行,保留最后一个用户名和当前角色列表的变量。如果用户名与last不同,则使用最后一个用户名和当前角色列表向数据表添加一个新行。如果用户名相同,则附加到角色列表。当你走到尽头时,不要忘记添加最后一行。

这解决了从您正在逐步执行的集合中删除行的问题。

答案 3 :(得分:0)

显然我的代码很有效。线i - = 1是额外的。很抱歉造成任何不便并感谢您的帮助

答案 4 :(得分:0)

循环部分看起来已被覆盖。

但是如果你没有意识到诀窍是从下往上工作(或者从最后一个元素到另一个元素),那么在循环时选择性地(或全部)删除项目可能会变得非常讨厌首先,或者你想要用它来表达它)。

这是问题删除部分的完整答案。

当您从上到下工作时,删除编号列表中的项目只会影响您已经处理的项目的索引 - 那么谁在乎呢,对吗?

-T。