我的数据库中的一个表中有一个名为price的字段,其类型为varchar
。在我的窗口中,我有一个绑定到该表的listview
和gridview
。我已将GridViewColumnHeader_Click
的{{1}}事件设置如下:
gridview
它对价格列进行排序,但它将价格值视为private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)
{
datatable.DefaultView.Sort = "price ASC";
datatable.DefaultView.ToTable();
}
s,因此它将价格排序为string
s,而不是数字。此行为是预期的,因为价格字段的类型为string
。为了解决这个问题,我将价格转换为varchar
,如下所示:
double
和
<GridViewColumn Header="price" DisplayMemberBinding="{Binding price, Converter={StaticResource convert1}}" />
但这并没有解决问题,价格仍被视为public class dataConvert1 : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return double.Parse(value.ToString());
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return new object(); }
}
而不是string
s。
这个问题看起来可能重复。但是没有回答相同的问题(这里或任何其他网站),这个问题仍然是一个问题。请帮忙解决这个问题。 (请不要建议将字段价格的类型从double
更改为varchar
)
答案 0 :(得分:1)
在视图中使用转换器不会影响DataView
的{{1}}如何排序...转换器只是一个UI格式化的东西,所以这不起作用。
您应该真正更改列的类型。或者您可以向DataTable
添加另一列并按此排序。像这样:
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
: