Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在DataGrid中对字母数字列进行排序_C#_Wpf_Vb.net_Sorting_Datagrid - Fatal编程技术网

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。