繁体   English   中英

C#datagridview订单列值错误

[英]C# datagridview order columns value bug

我是C#新手

我在datagrideview中遇到问题,我无法通过单击鼠标左键的标题来使列[大小]正确排序(KB >> MB >> GB)或(GB >> MB >> KB)

[Size]列中的值是nvarchar(60),并全部以文本形式添加(0.1 KB或2 MB .... etc)

我怎样才能做到这一点 ?

我想知道如何订购KB MB GB

从我的数据库

甚至这样处理SortCompare

private void dataGridView1_SortCompare(object sender,
            DataGridViewSortCompareEventArgs e)
{
    // Sort the size column
    if (e.Column.Name == "Size")
    {
        e.SortResult = new SizeComparer().Compare(
            e.CellValue1.ToString(), e.CellValue2.ToString());
        e.Handled = true;
    }
}

它将使用下面的代码进行比较以进行排序。 这段代码做了一个非常简单的事情:它采用最后两个字符(MB,GB)等,并以此为基础确定乘数。 然后将其乘以并乘以单位前的数字。 例如,对于1.0 KB ,它将执行1 * 1000 ,然后根据该值进行比较:

public class ItemSize
{
    public string Unit { get; set; }
    public double Value { get; set; }
}
public class SizeComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var itemX =  new ItemSize { Unit = x.Substring(x.Length - 2), Value = double.Parse(x.Substring(0, x.Length - 2)) };
        var itemY = new ItemSize { Unit = y.Substring(y.Length - 2), Value = double.Parse(y.Substring(0, y.Length - 2)) };
        SetItemSize(itemX);
        SetItemSize(itemY);

        return itemX.Value.CompareTo(itemY.Value);

    }

    private void SetItemSize(ItemSize item)
    {
        switch (item.Unit)
        {
            case "KB":
                item.Value *= 1000;
                break;
            case "MB":
                item.Value *= 1000000;
                break;
            case "GB":
                item.Value *= 1000000000;
                break;
            // Add all the other cases
            default:
                throw new ArgumentException("Looks like you missed one...");
        }
    }
}

请确保进行错误处理。 如果解析可能失败,请使用double.TryParse

暂无
暂无

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

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