Winforms Datagridview слишком медленно с ImageColumn - PullRequest
2 голосов
/ 26 ноября 2009

В моем приложении winforms у меня есть сетка данных, которая занимает около 0,8 секунд для заполнения +/- 5000rows - если все столбцы являются столбцами текстового поля.

Один из столбцов является целочисленным столбцом, поэтому я решил изменить этот столбец на ImageColumn, и в событии Cell_formatting сетки я использую следующий код, чтобы определить соответствующее изображение для отображения:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
    if (dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn && e.ColumnIndex == 1) {
        int cellVal = (int)e.Value;
        switch (cellVal) {
            case 1:
                e.Value = Properties.Resources.Pending;
                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "Item pending attention";
                break;
            case 2:
                e.Value = Properties.Resources.Tick
                dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "File is available";
                break;
            default:
                break;
        }
    }
}

Это работает. Однако, просмотр данных теперь занимает почти 5 секунд , чтобы заполнить себя !! и сортировка столбцов просто становится слишком трудоемкой. 5 секунд теперь могут показаться не слишком большими, но примерно через 2 месяца строки вырастут примерно до 30000 !!

Есть ли более эффективный способ справиться с этим сценарием?

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

Ответы [ 3 ]

1 голос
/ 26 ноября 2009

Вы проверили, что узкое место не в чтении и (возможно) изменении размеров изображений?

Если вы отображаете изображения с разрешением 32x32 пикселя (скажем), но они сохраняются с разрешением 128x128 пикселей (скажем), то при каждом отображении изображения будет происходить изменение размера.

1 голос
/ 27 ноября 2009

Если производительность вызывает беспокойство, вы можете рассмотреть возможность использования DataGridView в виртуальном режиме .

1 голос
/ 26 ноября 2009

Это может не помочь вообще, но вы можете сначала попробовать сделать сравнение e.ColumnIndex == 1. Поскольку && является оператором короткого замыкания, вы не будете оценивать dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn для каждого столбца.

Редактировать: я бы действительно использовал что-то вроде Visual Studio Profiler или какой-нибудь другой инструмент для повышения производительности, чтобы найти узкие места.

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