c # форма окна DataTable с сортировкой столбца изображения - PullRequest
0 голосов
/ 27 марта 2012

У меня есть DataGridView, и я устанавливаю DataSource для datagridview, используя 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;

Этот код сортирует, когда мой тип столбца строка, но я хочу сортировать на основе изображения также. Я хочу нажать на столбец изображения, и он должен сортировать на основе изображений. Существует только три типа изображений, поэтому я хочу, чтобы одно и то же изображение было вместе для более удобного отображения. Я искал, но не смог найти никакого решения. Любая вещь, которая может направить меня в правильном направлении?

Ошибка при попытке что-то вроде этого

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

Ошибка: элемент управления DataGridView с привязкой к данным может быть отсортирован только по столбцам с привязкой к данным.

ОБНОВЛЕНИЕ: Я добавил еще одну колонку. Он скрыт, при использовании щелчка на столбце изображения (1-й) он запускает события ColumnHeaderMouseClick. Добавлена ​​логика для сортировки скрытых столбцов. Это просто работа, на которую я нажал.

Спасибо тебе,

L.E.

1 Ответ

1 голос
/ 27 марта 2012

Вам нужно использовать 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 имеет произвольный порядок сортировки, который я только что придумал - вы можете переупорядочивать массив любым удобным для вас способом, а изображения следует переупорядочивать по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...