c#窗口窗体DataTable带有Image列Sorting
本文关键字:Image Sorting 带有 DataTable 窗口 窗体 | 更新日期: 2023-09-27 18:29:15
我有DataGridView,我使用DataTables设置DataGridView的DataSource。
DataTable dt = new DataTable();
dt.Columns.Add("Image",typeof(Bitmap));
dt.Columns.Add("Col2", typeof(string));
dt.Columns.Add("Col3", typeof(string));
dt.Columns.Add("Col4", typeof(string));
dt.Columns.Add("Col5", typeof(string));
int currentrow = 0;
foreach (Dev d in Devs)
{
dt.Rows.Add(dt.NewRow());
Bitmap bmp = Test(d);
dt.Rows[currentrow][0] = bmp;
dt.Rows[currentrow][1] = d .ID;
dt.Rows[currentrow][2] = d .Name;
dt.Rows[currentrow][3] = d .Country;
dt.Rows[currentrow][4] = d .State;
currentrow++;
}
datagridview.DataSource = dt;
当我的列类型为字符串时,这段代码会进行排序,但我也想根据图像进行排序。我想点击图片栏,它应该根据图片进行排序。只有三种类型的图像,所以我希望相同的图像应该放在一起,以便于显示。我继续寻找,但还没有找到任何解决方案。有什么能指引我走向正确的方向吗?
当我尝试类似的东西时出错
datagridview.Sort(dgvFusePTW.Columns[0], ListSortDirection.Ascending);
错误:数据绑定的DataGridView控件只能在数据绑定列上排序。
更新:我又增加了一个专栏。它是隐藏的,当使用点击图像列(第一列)时,它会触发ColumnHeaderMouseClick事件。在那里添加了逻辑以对隐藏列进行排序。这只是一个为我点击的工作。
谢谢你,
L.E.
如果要这样做,您需要使用DataView
。(您需要使用DataSetExtensions
来利用LINQ。)
// the Bitmap class has the RawFormat property that tells whether
// it's JPG, PNG, BMP, etc etc
DataView dv = dt.AsEnumerable()
.OrderBy(c => c.Field<Bitmap>("Image").GetImageOrder()) // sort by image type
.ThenBy(d => d.Field<string>("Col2")) // then sort by ID...
.AsDataView();
// take the dataview and bind...
datagridview.DataSource = dv;
您还需要定义以下静态扩展方法:
public static class ImageHelper
{
private static ImageFormat[] supportedFormats = new ImageFormat[]
{
ImageFormat.Bmp,
ImageFormat.Gif,
ImageFormat.Jpeg,
ImageFormat.Png,
ImageFormat.Tiff,
ImageFormat.Wmf,
ImageFormat.Emf,
ImageFormat.Exif
};
public static int GetImageOrder(this Image target)
{
for (int i = 0; i < supportedFormats.Length; i++)
{
if (target.RawFormat.Equals(supportedFormats[i]))
{
return i;
}
}
// the image format is not within our supported formats array:
// just order it to the very end
return 9999;
}
}
请注意,supportedFormats
数组有一个我刚刚想到的任意排序顺序——您可以按任何方式对数组进行重新排序,图像也可以按您的意愿进行重新排序。