我有一个数据表,其中包含许多列,其中三个是主要的:
有些酒店只包含dshotelid,有些只包含hotelid,有些包含dshotelid和hotelid。
我需要这样排序,以便那些同时拥有dshotelid和hotelid的酒店应该排在最前面,然后是那些只有dshotelid的酒店,最后那些酒店只有hotelid ...
请帮我创建一个这样的排序表达式。
我创造了这个:
dtmaintable.DefaultView.Sort = "dshotelid, hotelid"
但它没有给我想要的输出。
答案 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