Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
Wpf 数据表排序行为(双值不被视为数字)_Wpf_Sorting_Gridview_Datatable - Fatal编程技术网

Wpf 数据表排序行为(双值不被视为数字)

Wpf 数据表排序行为(双值不被视为数字),wpf,sorting,gridview,datatable,Wpf,Sorting,Gridview,Datatable,我在数据库中的一个表中有一个名为price的字段,它的类型是varchar。在我的窗口中,有一个listview和一个gridview,它们绑定到该表。我已将gridview的GridViewColumnHeader\u Click事件设置为: private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) { datatable.DefaultView.Sort = "price ASC"; d

我在数据库中的一个表中有一个名为price的字段,它的类型是varchar。在我的窗口中,有一个listview和一个gridview,它们绑定到该表。我已将gridview的GridViewColumnHeader\u Click事件设置为:

private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
{
    datatable.DefaultView.Sort = "price ASC";
    datatable.DefaultView.ToTable();
}
<GridViewColumn Header="price" DisplayMemberBinding="{Binding price, Converter={StaticResource convert1}}" />
它对price列进行排序,但它将价格值视为字符串,因此它将价格排序为字符串,而不是数字。这种行为是预期的,因为price字段的类型是varchar。为了解决这个问题,我将价格转换为两倍,如下所示:

private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
{
    datatable.DefaultView.Sort = "price ASC";
    datatable.DefaultView.ToTable();
}
<GridViewColumn Header="price" DisplayMemberBinding="{Binding price, Converter={StaticResource convert1}}" />
但这并没有解决问题,价格仍然被视为字符串而不是双倍。
这个问题看起来可能是重复的。但这些问题在这里或任何其他网站上都没有得到回答,这个问题仍然是个问题。请帮助解决这个问题。请不要建议在视图中使用转换器将字段price的类型从varchar更改为int

,这不会影响DataTable的DataView的排序方式……转换器只是一个UI格式化的东西,因此无法工作

您应该真正更改列的类型。或者,您可以向DataTable中添加另一列并按此列进行排序。大概是这样的:

private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
{
    if (!datatable.Columns.Contains("price2"))
    {
        datatable.Columns.Add(new DataColumn("price2") { DataType = typeof(double) });
        foreach (DataRow dr in datatable.Rows)
        {
            dr["price2"] = Convert.ToDouble(dr["price"]);
        }
    }
    datatable.DefaultView.Sort = "price2 ASC";
    datatable.DefaultView.ToTable();
}
或者,您可以简单地创建具有适当列类型的DataTable副本,并使用此副本而不是原始DataTable:


这就是问题的答案。几分钟前我想到了这个解决方案,我想写下答案,但幸运的是看到你完成了任务,谢谢@mm8。