使用dataTable按3个单独的列进行排序

时间:2015-11-06 19:04:50

标签: vb.net sorting datatable

我有一个我正在阅读的txt文件看起来像这样...

Acct |Name     |Date      |Country

11111,FirstLast,01/01/2015,United States
11111,FirstLast,,
11111,,01/01/2015,
22222,FirstLast,02/02/2015,Kuwait
22222,FirstLast,,
22222,,02/02/2015,
33333,FirstLast,02/02/2015,France
33333,FirstLast,,
33333,,02/02/2015,

我正在创建一个dataTable来填充这些数据,并添加一个名为“LINE”的列来跟踪每个帐户有多少行数据。然后我做一个dataView排序,就像这样排序:

dataView.Sort = "Acct ASC, Line ASC, Country ASC"

我的输出按行和行#排序,但不按国家排序。所以我回来了......

Acct |Name     |Date      |Country      |Line

11111,FirstLast,01/01/2015,United States,1
11111,FirstLast,,,2
11111,,01/01/2015,,3
22222,FirstLast,02/02/2015,Kuwait,1
22222,FirstLast,,,2
22222,,02/02/2015,,3
33333,FirstLast,02/02/2015,France,1
33333,FirstLast,,,2
33333,,02/02/2015,,3

我想要回来的是这个,因为主要的是保持相同的acct#记录在一起,同时按国家升序排序......

Acct |Name     |Date      |Country      |Line

33333,FirstLast,02/02/2015,France,1
33333,FirstLast,,,2
33333,,02/02/2015,,3
22222,FirstLast,02/02/2015,Kuwait,1
22222,FirstLast,,,2
22222,,02/02/2015,,3
11111,FirstLast,01/01/2015,United States,1
11111,FirstLast,,,2
11111,,01/01/2015,,3

然后我意识到显然这不起作用,因为帐号在分拣中优先。

最大的问题是我必须使用.NET 2.0,是否有某种方法可以对这些进行分组并按国家/地区排序?

1 个答案:

答案 0 :(得分:0)

理想情况下,这种类型的排序可以在显示中实现,例如GridView / DataGridView,通过 Acct 对字段进行分组,然后在组中排序为 Country Desc,Line Asc

如果您希望在DataTable中对其进行排序,则可以通过向DataTable添加另一个虚拟列来完成。

  1. 将另一列添加到 DataTable ,例如 Grp1
  2. Acct Asc和Country Desc 排序DataTable(以便国家/地区名称始终排在第一位且稍后空白)
  3. 在for循环中迭代DataTable(不是每个) 3.1。如果 Country 为空,则在上一行设置 country = country (跳过第0行,假设第0行中 country 总是有值)
    3.2。在同一个循环内(外部和后面的块)将 Grp1 列的值设置为 Country - Acct
  4. 现在再次按 Grp1
  5. 对您的DataTable进行排序

    全部放在一起:

    dt1.Columns.Add("Grp1")
    dt1.DefaultView.Sort = "Acct Asc, Country Desc"
    For i = 0 to dt1.Rows - 1
        If i > 0 AndAlso dt1.Rows(i).Item("Country").ToString.Length = 0 Then
            dt1.Rows(i).Item("Country") = dt1.Rows(i - 1).Item("Country").ToString  
        End If
        dt1.Rows(i).Item("Grp1") = dt1.Rows(i).Item("Country").ToString & " - " & dt1.Rows(i).Item("Acct").ToString  
    Next
    dt1.DefaultView.Sort = "Grp1 Asc, Line Asc"