请帮我在vb.net中为datatable创建排序表达式

时间:2010-02-02 07:16:20

标签: asp.net vb.net datatable sorting

我有一个数据表,其中包含许多列,其中三个是主要的:

  1. hotelid
  2. dshotelid
  3. hotelname
  4. 有些酒店只包含dshotelid,有些只包含hotelid,有些包含dshotelid和hotelid。

    我需要这样排序,以便那些同时拥有dshotelid和hotelid的酒店应该排在最前面,然后是那些只有dshotelid的酒店,最后那些酒店只有hotelid ...

    请帮我创建一个这样的排序表达式。

    我创造了这个:

    dtmaintable.DefaultView.Sort = "dshotelid, hotelid"
    

    但它没有给我想要的输出。

2 个答案:

答案 0 :(得分:1)

其中包含NULL的字段往往出现在排序列的顶部(除非排序按降序排列),因此您可能会看到底部都有hotelid和dshotelid的行,而不是顶部的行?

如何填充此数据表?如果它来自数据库查询,那么构造一个额外的列(或列)是一件简单的事情,其中​​包含您需要的任何排序键 - 无论是其他列的混合还是其他唯一标识符。

编辑:2010年2月4日 - 响应您的'FilterAndSortTable'解决方案:

您的解决方案有效,但不是因为FilterAndSortTable - 因为您使用了不同的排序顺序。

最初,你使用了“dsohtelid,hotelid”。

第二次,您使用了“dshotelid desc ,hotelid desc ”。

这样可以将非空值置于顶部,将空值置于底部,但我认为这是一个很好的解决方案。 你的id现在已经向后排序 - 我认为你可能想要避免这种情况,因此我建议新的排序列将尊重这一点。

但是,如果id的顺序无关紧要,那么你的解决方案就可以了,你只需坚持原始代码,加上'desc',就像这样:

dtmaintable.DefaultView.Sort = "dshotelid desc, hotelid desc"

当然,如果我在这里说过的任何内容对你有用,那么我们会非常感谢。这将帮助我达到50个代表点,最后能够写评论。 :)

答案 1 :(得分:0)

我得到了答案:

 datagrid1.datasource = FilterandSortTable(dtmaintable,"", "dshotelid desc, hotelid desc")

 Public Shared Function FilterandSortTable(ByVal SourceTable As DataTable, ByVal strFilters As String, Optional ByVal strOrder As String = "") As DataTable
    Dim Tbl As DataTable = SourceTable.Clone
    Dim rows() As DataRow = SourceTable.Select(strFilters, strOrder)
    For i As Integer = 0 To rows.Length - 1
        Tbl.ImportRow(rows(i))
    Next
    Return Tbl
End Function