【发布时间】:2016-08-13 15:29:38
【问题描述】:
我有一个带有字母数字值的 DataGrid,例如:
- 1 秒
- 100 英里
- 1499
- 28街
- 50 个苹果
- 701:一个素数
- 9
- 一根香蕉
这就是它的自动排序方式,因为所有值都是字符串。如何使它按整数排序,如下所示:
- 1 秒
- 9
- 28街
- 50 个苹果
- 100 英里
- 701:一个素数
- 1499
- 一根香蕉
我已尝试使用 SortMemberPath,但我不确定如何在我的代码隐藏中实现它。
<DataGrid.Columns>
<DataGridTextColumn x:Name="IdColumn" Binding="{Binding Id}" Header="Id"/>
<DataGridTextColumn x:Name="NameColumn" Binding="{Binding Name}" Header="Name" SortMemberPath="NumSort"/>
</DataGrid.Columns>
我什至尝试实现this 之类的东西,但是我尝试排序的属性位于自动生成的代码 (ItemsDataSet.Designer.vb) 中,其中包含超过 10000 行。不确定在那里放置任何东西是否明智,但尽管如此我已经尝试过,就像这样:
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
Public Property Name() As String
Get
Return CType(Me(Me.tablet_Items.NameColumn),String)
End Get
Set
Me(Me.tablet_Items.NameColumn) = Value
If Value IsNot Nothing Then NumSort = Integer.Parse(Value.ToString())
End Set
End Property
但是,VS 抱怨 NumSort 没有被声明。我不确定在代码中的哪里声明它,我在几个地方尝试过,但没有运气。
编辑:
我向前迈出了一小步。我已经实现了这段代码,它允许我对两列进行排序,但我仍然不确定如何访问网格中的每条记录以进行比较。
Private Sub dataGridName_Sorting(sender As Object, e As DataGridSortingEventArgs) Handles T_MoviesDataGrid.Sorting
e.Handled = True
Dim cView = CollectionViewSource.GetDefaultView(sender.ItemsSource)
Dim direction As ListSortDirection = ListSortDirection.Ascending
If cView.SortDescriptions.FirstOrDefault().PropertyName = e.Column.SortMemberPath Then
direction = If(cView.SortDescriptions.FirstOrDefault().Direction = ListSortDirection.Descending, ListSortDirection.Ascending, ListSortDirection.Descending)
End If
cView.SortDescriptions.Clear()
If e.Column.SortMemberPath = "NameSort" Then
AddSortColumn(DirectCast(sender, DataGrid), "Name", direction)
AddSortColumn(DirectCast(sender, DataGrid), "Id", direction)
End If
End Sub
Private Sub AddSortColumn(sender As DataGrid, sortColumn As String, direction As ListSortDirection)
Dim cView = CollectionViewSource.GetDefaultView(sender.ItemsSource)
cView.SortDescriptions.Add(New SortDescription(sortColumn, direction))
For Each col In sender.Columns.Where(Function(x) x.SortMemberPath = sortColumn)
col.SortDirection = direction
Next
End Sub
在几个类似的主题中,人们经常建议使用 IComparer。我试图实现,但我不确定如何实现。这就是我卡住的地方:
Public Class MyComparing
Inherits MyDataSet
Implements IComparable
Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
Return '???
End Function
End Class
我没有从 MyDataSet 继承,而是尝试使用 partial,但仍然卡住了。
【问题讨论】:
标签: c# wpf vb.net sorting datagrid