我是 C# 新手
我的 datagrideview 中有问题我无法通过单击鼠标左键以正确的方式(KB >> MB >> GB)或(GB >> MB >> KB)对列 [Size] 进行排序
列 [Size] 中的值为nvarchar(60)并全部添加为文本(0.1 KB 或 2 MB ....etc)
我怎样才能做到这一点 ?
我是 C# 新手
我的 datagrideview 中有问题我无法通过单击鼠标左键以正确的方式(KB >> MB >> GB)或(GB >> MB >> KB)对列 [Size] 进行排序
列 [Size] 中的值为nvarchar(60)并全部添加为文本(0.1 KB 或 2 MB ....etc)
我怎样才能做到这一点 ?
像这样处理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
如果存在解析可能失败的情况,请使用。