我正在使用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,...
请帮忙。 提前谢谢。
答案 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
这样你就可以得到你想要的东西而无需实现自定义排序。