DataGridView флажок столбец «выбрать все» производительность - PullRequest
7 голосов
/ 03 октября 2011

У меня есть DataGridView со столбцом флажка. Я пытаюсь создать кнопку выбора / отмены выбора всех. Код для изменения значений достаточно прост, но производительность ужасна.

for (int i = 0; i < dgv.RowCount; i++)
{
    dgv.Rows[i].Cells["Selected"].Value = _selectAll;
}

_selectAll - это просто переменная типа bool. Есть ли лучший способ сделать это там, где производительность высокая? Я также попытался изменить значение в базовом DataTable. Для нескольких сотен строк по-прежнему требуется несколько секунд, но большая часть работы будет выполняться для тысяч строк.

РЕДАКТИРОВАНИЕ И РЕШЕНИЕ (2011/10/4)

Основная проблема была в свойствах DGV. Как только я установлю,

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
Производительность

значительно улучшена (за Производительность MSDN DataGridView ). Решения, предложенные на момент этого редактирования, также немного улучшат производительность.

Ответы [ 5 ]

6 голосов
/ 23 июня 2012

Большое спасибо, установив свойство AutoSizeColumnsMode

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

производительность намного лучше ...

1 голос
/ 03 октября 2011

Ну, это обычная проблема.
Во-первых, есть ли у вас какая-либо обработка, связанная с измененным флажком Checkbox?
Если это так, создайте переменную-член bool.
Инициализируйте его как false перед выполнением выбора всех / отменить все.
В CheckBox проверено событие изменения -> проверьте значение параметра bool.
Если это приходит с ложным возвратом из события. Ничего не обрабатывать.
После завершения цикла for для установки select all / Deselect All обработайте событие отмеченного изменения, если необходимо.
Не забудьте сбросить параметр bool в true после цикла for.

bool _allowProcessing = false;
//SelectAll / Deselect All
for (int i = 0; i < dgv.RowCount; i++)
{
   dgv.Rows[i].Cells[4].Value = _selectAll;
}
_allowProcessing = true;
// Do some processing if required

// Checked change event
public void CheckBox_CheckedChange(object sender, eventArgs e)
{
  if(!_allowProcessing)
    return;

  // Do Processing
}
0 голосов
/ 29 сентября 2014

Я показываю другой способ решения этой проблемы.
При прямом доступе к сетке просмотра данных, например dgv.Rows[i].Cells["Selected"].Value, медленный просмотр данных.

Таким образом, изменение источника данных и обновление сетки данных повышает соответствие производительности, если ваше представление сетки данных имеет источник данных, а источник данных имеет проверенный статус.

foreach (var item in yourDataSource)
{
    item.Checked = _selectAll;
}
dgv.Invalidate();
0 голосов
/ 03 октября 2011

Вместо того, чтобы давать имя столбца gridview, вы можете указать, к какому столбцу он принадлежит. Это будет работать быстрее.Надеюсь, это поможет.

for (int i = 0; i < dgv.RowCount; i++)
{
   dgv.Rows[i].Cells[4].Value = _selectAll;
}
0 голосов
/ 03 октября 2011

Не уверен, получите ли вы повышение производительности или нет, но вы можете попробовать еще кое-что:

for (int i = 0; i < dgv.RowCount; i++)
{
    dgv["Selected", i].Value = _selectAll;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...