首页 > 解决方案 > 数据表和两行排序

问题描述

所以老板来找我说:“我想要一条线上的每个代理和项目的价值,以及下一条线上所有其他代理的平均值,这样我就可以很容易地看出它们是高于还是低于平均水平。”

该表如下所示:

dt.Columns.Add("AGENT", GetType(String))
        dt.Columns.Add("PROJECT", GetType(String))
        dt.Columns.Add("Sales", GetType(Integer))
        dt.Columns.Add("Declines", GetType(Integer))
        dt.Columns.Add("Margin", GetType(Integer))

好的,一切都很好。数据表中的一行是代理和项目。下一行是所有其他代理和项目的平均值,如下所示:

第 1 行:John Smith,ProjectName,(其他列值)

第 2 行:John Smith,ProjectName & "AVERAGE/TOTAL",(其他列值)

项目名称在 SSRS 报告中的 AVERAGE/TOTAL 行中被删除,因为打印它的纸张上的空间限制。

我按照我们对数据表进行排序的标准方式进行排序。

Dim dataView As New DataView(dt1)
        dataView.Sort = "AGENT,PROJECT"
        dt1 = dataView.ToTable
        Return dt1

但是现在老板后来又有了新的要求。他希望能够按表中的其他列排序,但将两行(代理/项目和代理/项目 AVERAGE/TOTAL)保持在一起。所以本质上他希望能够不是按一行而是按两行排序,但排序值可以是“AGENT,Margin”。显然,要将两行保持在一起,我也必须找到一种对 Project 值进行排序的方法。

所以我很难过,并会感激你可能有的任何想法。C# 的想法也很受欢迎。LINQ 很好,但它必须成为一个数据表。

标签: vb.netsortingdatatableado.net

解决方案


所以你创建了两个表。一个是行值,一个是平均值。循环遍历行值,然后在该循​​环内执行另一个循环以匹配项目名称。它是一个黑客,但它有效。

If SortValue = "Default" Then
            dt1.Merge(dt)
            Dim dataView As New DataView(dt1)
            dataView.Sort = "AGENT,PROJECT"
            dt1 = dataView.ToTable
        Else
            Dim dataView As New DataView(dt)
            dataView.Sort = SortValue
            dt = dataView.ToTable
            Dim dtCopy As New DataTable
            dtCopy = dt.Clone

            For Each row As DataRow In dt.Rows
                dtCopy.ImportRow(row)
                For i = 0 To dt1.Rows.Count - 1
                    If dt1.Rows(i).Item("PROJECT").ToString.Replace(" AVERAGE/TOTAL", "") = row.Item("PROJECT") And dt1.Rows(i).Item("AGENT") = row.Item("AGENT") Then
                        dtCopy.Rows.Add(dt1.Rows(i).Item("AGENT"), dt1.Rows(i).Item("PROJECT"), dt1.Rows(i).Item("SALES"), dt1.Rows(i).Item("Declines"), dt1.Rows(i).Item("Margin"))
                    End If
                Next
            Next
            dt1 = dtCopy
        End If

推荐阅读