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.

c#窗口窗体DataTable带有Image列Sorting

如果要这样做,您需要使用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数组有一个我刚刚想到的任意排序顺序——您可以按任何方式对数组进行重新排序,图像也可以按您的意愿进行重新排序。