C#datagridview顺序列值错误
我是C语言的新手# 我的DataGridView中有一个问题,我无法通过鼠标左键单击标题使列[Size]按正确的顺序排列(KB>>MB>>GB)或(GB>>MB>>KB) [Size]列中的值是nvarchar(60),并且全部作为文本添加(0.1KB或2MB…等) 我该怎么做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
处理
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,这是否会使排序更容易??