简体   繁体   中英

c# window form DataTable with Image column Sorting

I have DataGridView and I set DataSource of datagridview by using DataTables.

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;

This code sort when my column type of string, but i want to sort based on image also. I want to click on image column and it should sort based on images. There are three types of image only, so i want same image should be together for easier display purpose. I searched on but could not find any solution yet. Any thing that can guide me to right direction?

Got Error when i Tried something like this

 datagridview.Sort(dgvFusePTW.Columns[0], ListSortDirection.Ascending);

Error : Data-bound DataGridView control can only be sorted on data-bound columns.

UPDATE : I added one more column. It is hidden, when use click on Image column (1st one), it fires ColumnHeaderMouseClick events. Added Logic there to sort hidden column. It is just work around which one clicked for me.

Thanks you,

LE

You need to use a DataView if you want to do that. (You will need to use DataSetExtensions to leverage the 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;

You also need to define the following static extension method:

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;
    }
}

Note that the supportedFormats array has an arbitrary sort order that I just thought up -- you can reorder the array any way you want and the images should reorder as you wish.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM