在datagridview中对数字列进行排序

时间:2015-08-04 11:51:44

标签: c# sorting datagridview

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

我正在使用datagridview的autosort方法(通过单击列标题进行排序)。 这适用于除此数字列之外的所有列。 此列包含数字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,...

请帮忙。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

您可以像这样使用事件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
     }
}

答案 1 :(得分:1)

构建您的DataTable:

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

我正在使用这些列,因为我不知道您要存储的数据。

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

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。您可以像我一样构建另一个DataTable并遍历您的Data并将ID转换为Integer。请不要忘记设置列类型:

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

答案 2 :(得分:0)

嗯,您的列不是数字,而是包含数字字符串值的文本列。这有很大的不同!真正的数字列将应用数字排序,而您的列使用字母数字排序。

我尝试将基础数据类型实际更改为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

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