C# 如何在DataGrid中对字母数字列进行排序
我有一个带有字母数字值的数据网格,例如:C# 如何在DataGrid中对字母数字列进行排序,c#,wpf,vb.net,sorting,datagrid,C#,Wpf,Vb.net,Sorting,Datagrid,我有一个带有字母数字值的数据网格,例如: 1秒 100英里 1499 第28街 50个苹果 701:质数 九, 香蕉 这就是它自动排序的方式,因为所有值都是字符串。如何将其排序为整数,如下所示: 1秒 九, 第28街 50个苹果 100英里 701:质数 1499 香蕉 我尝试了SortMemberPath,但我不确定如何在我的codebehind中实现这一点 我甚至尝试实现了这样的东西,但我试图排序的属性是在自动生成的代码(ItemsDataSet.Designer.vb)中,有1
- 1秒
- 100英里
- 1499
- 第28街
- 50个苹果
- 701:质数
- 九,
- 香蕉
- 1秒
- 九,
- 第28街
- 50个苹果
- 100英里
- 701:质数
- 1499
- 香蕉
SortMemberPath
,但我不确定如何在我的codebehind中实现这一点
我甚至尝试实现了这样的东西,但我试图排序的属性是在自动生成的代码(ItemsDataSet.Designer.vb)中,有10000多行。不确定在那里放置任何东西是否明智,但尽管如此,我还是尝试过,比如:
_
作为字符串的公共属性名()
得到
返回CType(Me(Me.tablet\u Items.NameColumn),字符串)
结束
设置
Me(Me.tablet\u Items.NameColumn)=值
如果值不是空,则NumSort=Integer.Parse(Value.ToString())
端集
端属性
但是,VS抱怨未声明NumSort。我不确定在代码中声明它的位置,我已经在几个地方尝试过了,但是没有成功
编辑: 我向前迈出了一小步。我已经实现了这段代码,允许我对两列进行排序,但我仍然不确定如何访问网格中的每条记录来进行比较
Private Sub-dataGridName\u排序(发送方作为对象,e作为DataGridSortingEventArgs)处理T\u MoviesDataGrid.Sorting
e、 已处理=真
Dim cView=CollectionViewSource.GetDefaultView(sender.ItemsSource)
变暗方向为ListSortDirection=ListSortDirection.升序
如果cView.SortDescriptions.FirstOrDefault().PropertyName=e.Column.SortMemberPath,则
方向=If(cView.SortDescriptions.FirstOrDefault().direction=ListSortDirection.Descending,ListSortDirection.升序,ListSortDirection.Descending)
如果结束
cView.SortDescriptions.Clear()
如果e.Column.SortMemberPath=“NameSort”,则
AddSortColumn(DirectCast(发送方,数据网格),“名称”,方向)
AddSortColumn(DirectCast(发送方,数据网格),“Id”,方向)
如果结束
端接头
私有子AddSortColumn(发送方为DataGrid,sortColumn为String,方向为ListSortDirection)
Dim cView=CollectionViewSource.GetDefaultView(sender.ItemsSource)
cView.SortDescriptions.Add(新的SortDescription(sortColumn,方向))
对于sender.Columns.Where(函数(x)x.SortMemberPath=sortColumn)中的每个列
col.SortDirection=方向
下一个
端接头
在一些类似的主题中,人们经常建议使用IComparer。我尝试在上实现,但不确定如何实现。这就是我被困的地方:
公共类MyComparing
继承MyDataSet
实现不可比较
作为整数的公共函数CompareTo(obj作为对象)实现了IComparable.CompareTo
返回'???
端函数
末级
我没有从MyDataSet继承,而是尝试使用部分
,但仍然卡住了。试试这个
- Dim视图作为新数据视图(tbl)
- View.Sort=“Scol1,Scol2”
- View.Table=DataSet1.Tables(“dtBills”)
- 第二个选项是使用正则表达式来细化数值 在第一次出现任何字符之前,例如从 “123Abc”并从以下函数返回
_
作为字符串的公共属性名()
得到
返回CType(Me(Me.tablet\u Items.NameColumn),字符串)
结束
设置
Me(Me.tablet\u Items.NameColumn)=值
int yourIndexNumber=str.IndexOf(char)(c=>!char.IsWhiteSpace(c));
如果值不是空,则NumSort=int.Parse(Value.Substring(0,Value.IndexOf(yourIndexNumber,StringComparison.InvariantCultureIgnoreCase)))
端集
端属性
在带有数据网格的xaml文件的代码隐藏中,您可以创建自定义排序规则NumSort
将NumSort应用于datagrid排序事件,如下所示:
AddHandler dataGrid.Sorting, AddressOf NumSort
或者vb的等价物是什么
dataGrid.Sorting += new DataGridSortingEventHandler(NumSort)
这在这里的回答中有进一步的描述:
问题在于
NumSort
没有定义,因此我无法使用它。此外,这部分代码位于自动生成的文件中,每次在设计器中进行修改时都会更改。不幸的是,他们使用的是ListCollectionView
,而我的BindingListCollectionView
不支持CustomSorters。