繁体   English   中英

如何在DataGridView中将字符串按数字排序

[英]How to sort string as numbers in DataGridView

我在datagridview中有带有特定数字的字符串列。 没有限制。 我想正确排序。 默认的DataGridView排序不正确。

示例:Dgv对其进行如下排序:

 - FS 752/08/2014
 - FS 752/06/2015
 - FS 751/12/2013
 - FS 751/08/2014
 - FS 751/06/2015

它应该像这样:

 - FS 752/06/2015
 - FS 751/06/2015
 - FS 752/08/2014
 - FS 751/08/2014
 - FS 751/12/2013

我该如何实现?

如前所述,您没有使用DataSource则可以尝试使用SortCompare事件

当用户单击列以更改排序顺序时,或者以编程方式调用Sort函数时,将调用此事件。

这是一个基本的例子。 我假设您要对年份(?),月份(?),第一个数字进行排序:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{

    // Check if we are sorting by the special column.
    if (myDataGridView.Columns.Contains("My_Column") && e.Column == myDataGridView.Columns["My_Column"])
    {

        // Parse the special values (add validation if required).
        string[] parts1 = e.CellValue1.ToString().Trim().Split('/');
        int a1 = int.Parse(parts1[0].Split(' ')[2]);
        int b1 = int.Parse(parts1[1]);
        int c1 = int.Parse(parts1[2]);
        string[] parts2 = e.CellValue2.ToString().Trim().Split('/');
        int a2 = int.Parse(parts2[0].Split(' ')[2]);
        int b2 = int.Parse(parts2[1]);
        int c2 = int.Parse(parts2[2]);

        // Compare each value as required.

        // First compare the last value (year?)
        e.SortResult = c1.CompareTo(c2);

        // If equal, then compare second value (month?)
        if(e.SortResult == 0)
            e.SortResult = b1.CompareTo(b2);

        // Finally if still equal, then compare first value
        if(e.SortResult == 0)
            e.SortResult = a1.CompareTo(a2);

    }

}

注意 :如果不能确保每个单元格中始终都有有效的格式,则需要向此事件添加验证逻辑。 例如,使用int.TryParse()并检查null值,并验证string拆分的长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM