在datagridview中排序数字列

本文关键字:数字 排序 datagridview | 更新日期: 2023-09-27 18:06:28

我正在使用datagridview来显示csv文件中的数据。datagridview中数字类型[column name: ID]的列之一。

我正在使用datagridview的自动排序方法(通过单击列标题排序)。这对于除了这个数字列之外的所有列都很有效。此列包含数字1到55

我现在得到的排序后是:

1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31...

…等等......我想要的是:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,...

请帮助。

在datagridview中排序数字列

您可以这样使用事件SortCompare:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) {
    //Suppose your interested column has index 1
    if (e.Column.Index == 1){
       e.SortResult = int.Parse(e.CellValue1.ToString()).CompareTo(int.Parse(e.CellValue2.ToString()));
       e.Handled = true;//pass by the default sorting
     }
}

创建DataTable:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(Int32));
dt.Columns.Add("Name");
dt.Columns.Add("ForeName");

我正在使用这些列,因为我不知道你在存储什么数据。

读取csv文件后,必须遍历数据。考虑到您的数据存储在字符串数组(String[][] arr)中,内部ArrayLength为3 (ID, Name, rename)。

for(int i=0;i<arr.Length;i++)
{
    DataRow row = dt.NewRow();
    row["ID"] = Convert.ToInt32(arr[i][0]);
    row["Name"] = arr[i][1];
    row["ForeName"] = arr[i][2];
    dt.Rows.Add(row);
}
DataGridView dgv = new DataGridView();
dgv.DataSource = dt;

我希望这有帮助,这是一个示例代码。

对DataTable的引用:https://msdn.microsoft.com/de-de/library/system.data.datatable(v=vs.110).aspx

编辑

我刚刚读到你已经有一个数据表作为结果。您可以像我一样构建另一个DataTable,遍历Data并将ID转换为Integer。请不要忘记设置列类型:

dt.Columns.Add("ID", typeof(Int32));

您的列不是数字列,而是包含数字字符串值的文本列。这是一个巨大的区别!真正的数值列将应用数值排序,而您的列将使用字母数字排序。

我会尝试实际更改底层数据类型为int而不是string或按lem2802建议应用手动排序。

请添加一些关于如何填充数据网格视图的信息。也许这可以帮助找到一种比实现手动排序比较更简单的方法。


根据您的评论,您创建了一个DataTable作为网格视图的数据源。您需要确保包含数值的列也具有数值类型。在创建表及其列的代码中,执行如下操作:

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(Int32));
... // Other columns

稍后,当您根据CSV文件的内容创建行时,请确保填充每行,以便ID列的值实际上是int:

DataRow row = table.NewRow();
row["ID"] = Convert.ToInt32(idValueFromCSV);
... // Other columns

这样你就可以得到你想要的,而不需要实现自定义排序。