c#DataView& DataGridView排序

时间:2014-02-25 20:19:13

标签: c# winforms sorting datagridview dataview

我有一个小问题。我需要按降序对DataGridView(WinForms应用程序)中的数据进行排序。我将DataView作为DataSource应用于myGrid:

DataView view = myDataTable.DefaultView;
view.Sort = "id DESC";
myGrid.DataSource = view;

id列是字符串数据类型,格式为## / yy。第一部分是递增整数,第二部分(在'/'之后)是当前年份的最后两位数。不幸的是,它必须采用这种格式。

排序后,按此顺序返回:

9/14,8/14,7/14,6/14,5/14,4/14,3/14,2/14,10/14,1/14...

但它应该是这样的:

10/14,9/14,8/14,7/14,6/14,...

解决这个问题最简单的方法是什么? 谢谢。

编辑: 添加了更多信息...

1 个答案:

答案 0 :(得分:1)

这里有几个选项。您可以通过直接修改值来克隆表并修改类型并对其进行类型转换,或者可以使用辅助列等。这可以通过多种方式完成。我将给你一个简单的例子,它使用一个帮助列将字符串处理成一个日期,然后以这种方式排序。

如果你有一些整数(我将使用一个16位整数作为类型)和一个由/分隔的两位数年份,我们可以按如下方式编写它:

// Setup a sample table to match yours
DataTable myDataTable = new DataTable();
myDataTable.Columns.Add("id", typeof(string));

// Add some values to the table
myDataTable.Rows.Add("7/14");
myDataTable.Rows.Add("4/14");
myDataTable.Rows.Add("8/14");
myDataTable.Rows.Add("3/14");
myDataTable.Rows.Add("6/14");
myDataTable.Rows.Add("10/14");
myDataTable.Rows.Add("5/14");
myDataTable.Rows.Add("2/14");
myDataTable.Rows.Add("9/14");
myDataTable.Rows.Add("1/14");

// Add a helper column with 16-bit format based on the values in id
myDataTable.Columns.Add("helper", typeof(Int16));

// Convert the value in the id column of each row to a string,
// then split this string at the '/' and get the first value.
// Convert this new value to a 16-bit integer,
// then save it in the helper column.
foreach (DataRow row in myDataTable.Rows) row["helper"] =
    Convert.ToInt16(row["id"].ToString().Split('/')[0]);

// Create a view to match yours, sorting by helper column instead of id
DataView view = myDataTable.DefaultView;
view.Sort = "helper DESC";
//myGrid.DataSource = view;

// Write the output from this view
foreach (DataRow row in view.ToTable().Rows) Console.WriteLine(row["id"]);

产生输出......

10/14
9/14
8/14
7/14
6/14
5/14
4/14
3/14
2/14
1/14

如果您还需要按年份排序,您可以以相同的方式添加其他帮助列。