【问题标题】:Sorting numeric column in datagridview在datagridview中对数字列进行排序
【发布时间】:2015-10-26 19:36:06
【问题描述】:

我正在使用 datagridview 来显示 csv 文件中的数据。 datagridview 中数值类型的列之一 [列名: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,...

请帮忙。 提前致谢。

【问题讨论】:

  • “ID”列存储为字符串。这就是为什么它被排序为 1, 10, 11,... 你能发布一些代码吗?
  • private void btnSort_Click_1(object sender, EventArgs e) { foreach (DataGridViewColumn column in Grid.Columns) { Grid.Columns[column.Name].SortMode = DataGridViewColumnSortMode.Automatic; } }
  • 看看@lem2802 的答案,我想这正是您要寻找的。问题是,如果您读取 csv 文件,所有值都是字符串。 DataGridview 只是按字符值对字符串进行排序。
  • 有人可以评论一下如何从 csv 获取数据到 datagridview 以便进行这种排序吗?
  • 是的,您可以创建一个容器(例如 DataTable)并将此容器用作 DataSource。在将 ID 存储在 DataTable 中之前,您必须将其转换为 Integer。如果你愿意,我可以发布一些代码作为答案。

标签: c# sorting datagridview


【解决方案1】:

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

【讨论】:

  • 试过了!此事件的代码无法访问!不知道为什么? :(
  • @MrAj 您是否将事件添加到 DataGridView?例如:dvg.OnSortCompare += dataGridView1_SortCompare;dvg 是 DataGridView。
  • 我应该在哪里添加这个事件?表单加载?之前,我通过点击grid->properties->events->setcompare来添加这个事件。够了吗?
【解决方案2】:

构建您的数据表:

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

我使用这些列是因为我不知道您存储的是什么数据。

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

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 并遍历您的数据并将 ID 转换为整数。请不要忘记设置列类型:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我正在使用私有 DataTable loadCSVDataTable(string strCsvFilePath) { using TextFieldparser 我正在返回数据表}
    • 然后是 Grid.DataSource = dtAllTableData.DefaultView;
    • 然后您应该更改DataTable(创建列的部分)的定义以创建Int32 列。我将编辑我的答案给你看一个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2016-08-23
    • 2015-06-28
    相关资源
    最近更新 更多