У меня есть DataGridView с вертикальной и горизонтальной прокруткой в форме.
Я использую виртуальный режим, потому что базовый источник данных огромен.
Когда я прокручиваю вправо, если последний столбец не полностьюпоказано в представлении, затем я вижу повторные вызовы CellValueNeeded.
Как я могу это исправить?
Мои мысли:
Почему CellValueNeedв любом случае, неоднократно вызывал частично видимый столбец?Возможно, я смогу устранить причину этого.
Внутри CelValueNeeded - могу ли я обнаружить, что он частично виден, и вернуть без обработки?При отображении значений ячеек значения «Отображается» и «Видимый» имеют значение true.
Мой код:
private void grid_Data_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
Console.WriteLine("CellValue: " + e.RowIndex + " " + e.ColumnIndex);
if (e.RowIndex > Grid.Rows.Count - 1)
return;
DataGridView gridView = sender as DataGridView;
e.Value = Grid.Rows[e.RowIndex][e.ColumnIndex];
gridView.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex).ToString();
}
РЕДАКТИРОВАТЬ1:
После ответа Digitalsa1nt я нашел способ решить проблему.Это сложно, потому что первый столбец обрабатывается иначе, чем последний столбец.И это имеет значение, если вы устанавливаете RowHeaders.
В CellValueNeed выше, я теперь возвращаюсь, если следующая функция истинна.
private bool IsPartiallyVisible(DataGridView gridView, DataGridViewCellValueEventArgs e)
{
if (gridView.FirstDisplayedScrollingColumnIndex == e.ColumnIndex)
{
if (gridView.FirstDisplayedScrollingColumnHiddenWidth != 0)
{
return true;
}
}
bool sameWidth = gridView.GetColumnDisplayRectangle(e.ColumnIndex, false).Width == gridView.GetColumnDisplayRectangle(e.ColumnIndex, true).Width;
return !sameWidth;
}