【发布时间】:2013-06-25 10:42:56
【问题描述】:
一般信息
我有一个包含多列的 ListView。我使用了Microsoft Method to sort my ListView Columns。 ListView 由 SQL 查询填充,该查询将字符串和整数正确排序在一起(代码如下所示)。例如:
字符串和整数排序问题
以下JobNumber 字符串被视为已排序
“10”、“1”、“2”、“3”
使用我的 SQL 查询,它们会变成
“1”、“2”、“3”、“10”
SQL 字符串和整数排序器
这是我用来正确排序字符串和整数的查询
SELECT PK_BillHeader, JobNumber, Description
FROM dbo.BillHeaders
ORDER BY Case IsNumeric(JobNumber)
When 1 Then Replicate('0', 50 - Len(JobNumber)) + JobNumber
Else JobNumber
End
这会输入零,直到得到我的 SQL 列的最大长度(50 个字符)减去 JobNumber 的当前长度。这样,所有内容都被视为一个字符串(包括整数),然后可以正确排序。
我的问题
当我单击 ListView 列标题(使其进行排序)时,它会停止对字符串和整数进行正确排序,就像对我的 SQL 查询所做的那样。相反,它将所有内容排序为一个字符串,再次复制我的“String & Integer”排序问题......更重要的是,如果我有十进制值(第二张图片) ,它把它们分类得很奇怪(查看我的比较代码)
比较代码
Public Function [Compare](ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim xItem As clsSortWrapper = CType(x, clsSortWrapper)
Dim yItem As clsSortWrapper = CType(y, clsSortWrapper)
Dim xText As String = xItem.sortItem.SubItems(xItem.sortColumn).Text
Dim yText As String = yItem.sortItem.SubItems(yItem.sortColumn).Text
If Decimal.TryParse(xText, vbNull) Then xText = xText.PadLeft(10, "0"c)
If Decimal.TryParse(yText, vbNull) Then yText = yText.PadLeft(10, "0"c)
Return xText.CompareTo(yText) * IIf(Me.ascending, 1, -1)
End Function
有没有更简单的方法来实现我用字符串和整数对 ListView 进行排序的结果?
注意:
我省略了在此处发布ListView Sort code,因为它会使帖子聚集很多。我提供了详细解释的链接。
【问题讨论】:
-
还有一个题外话提示:如果你熟悉 C#,我建议你添加标签 C#,因为它的关注者是 VB.NET 的十倍。
-
@FabianBigler 谢谢!我会这样做的
标签: c# vb.net listview sorting