【问题标题】:How to sort an alphanumeric column in DataGrid如何对 DataGrid 中的字母数字列进行排序
【发布时间】: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


    【解决方案1】:

    试试这个

    • Dim View As New DataView(tbl)

    • View.Sort = "Scol1,Scol2"

    • View.Table = DataSet1.Tables("dtBills")

    • 第二个选项是使用正则表达式来细化数字 直到第一次出现任何字符例如取“123” "123Abc" 并从以下函数返回

    _ Public Property Name() As String Get Return CType(Me(Me.tablet_Items.NameColumn),String) End Get Set Me(Me.tablet_Items.NameColumn) = Value int yourIndexNumber = str.IndexOf(char)(c => !char.IsWhiteSpace(c)); If Value IsNot Nothing Then NumSort = int.Parse(value.Substring(0, value.IndexOf(yourIndexNumber,StringComparison.InvariantCultureIgnoreCase))) End Set End Property

    【讨论】:

    • 问题是NumSort 没有定义所以我不能使用它。此外,这部分代码位于自动生成的文件中,每次在设计器中进行修改时都会更改。
    【解决方案2】:

    在带有数据网格的 xaml 文件的代码中,您可以创建自定义排序规则 NumSort

    像这样将 NumSort 应用于数据网格排序事件:

    AddHandler dataGrid.Sorting, AddressOf NumSort
    

    或任何与

    等效的 vb
    dataGrid.Sorting += new DataGridSortingEventHandler(NumSort)
    

    这在此处的答案中有进一步的描述: How can I apply a custom sort rule to a WPF DataGrid?

    【讨论】:

    • 不幸的是,他们使用的是 ListCollectionView,而我的 BindingListCollectionView 不支持 CustomSorters。
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2011-02-06
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多