C#datagridview顺序列值错误

C#datagridview顺序列值错误,c#,datagridview,header,datagridviewcolumn,tab-ordering,C#,Datagridview,Header,Datagridviewcolumn,Tab Ordering,我是C语言的新手# 我的DataGridView中有一个问题,我无法通过鼠标左键单击标题使列[Size]按正确的顺序排列(KB>>MB>>GB)或(GB>>MB>>KB) [Size]列中的值是nvarchar(60),并且全部作为文本添加(0.1KB或2MB…等) 我该怎么做 处理SortCompare,即使是这样: private void dataGridView1_SortCompare(object sender, DataGridViewSortCompar

我是C语言的新手#

我的DataGridView中有一个问题,我无法通过鼠标左键单击标题使列[Size]按正确的顺序排列(KB>>MB>>GB)或(GB>>MB>>KB)

[Size]列中的值是nvarchar(60),并且全部作为文本添加(0.1KB或2MB…等)

我该怎么做


处理
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.0kb
,它将执行
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...");
        }
    }
}
公共类ItemSize
{
公共字符串单元{get;set;}
公共双值{get;set;}
}
公共类大小比较者:IComparer
{
公共整数比较(字符串x、字符串y)
{
var itemX=newitemsize{Unit=x.Substring(x.Length-2),Value=double.Parse(x.Substring(0,x.Length-2));
var itemY=newitemsize{Unit=y.Substring(y.Length-2),Value=double.Parse(y.Substring(0,y.Length-2));
SetItemSize(itemX);
SetItemSize(itemY);
返回itemX.Value.CompareTo(itemY.Value);
}
私有void SetItemSize(ItemSize项)
{
开关(项目单位)
{
案例“KB”:
项目价值*=1000;
打破
案例“MB”:
项目价值*=1000000;
打破
案例“GB”:
项目价值*=100000000;
打破
//添加所有其他案例
违约:
抛出新的ArgumentException(“看起来你错过了一个…”);
}
}
}

请确保执行错误处理。如果存在解析可能失败的情况,请使用
double.TryParse

可以更改大小列的类型吗?是的,我可以这样做数据源的类型是什么?此日期将由用户输入文件的大小。。这就是你的意思吗?我想你需要额外的方法来对
DataTable
中的文件大小列进行自然排序,并使用
ColumnHeaderMouseClick
事件处理排序。是从磁盘中的实际文件检索到的文件大小,还是在不计算实际文件的情况下刚获得的文件大小?找不到类型或命名空间名称“IComparer”(您是否缺少using指令或程序集引用。。。。。很抱歉,我是c语言新手#如何解决此问题?您需要导入:将其置于顶部:
使用System.Collections.Generic
。这是不可能的。我测试了那个代码。问题在别处。你不工作是什么意思?您是否将此代码添加到事件处理程序?如果有办法将所有大小转换为KB,这是否会使排序更容易??