Повторные вызовы CellValueNeeded - PullRequest
0 голосов
/ 11 июня 2018

У меня есть DataGridView с вертикальной и горизонтальной прокруткой в ​​форме.

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

Когда я прокручиваю вправо, если последний столбец не полностьюпоказано в представлении, затем я вижу повторные вызовы CellValueNeeded.

Как я могу это исправить?

Мои мысли:

  1. Почему CellValueNeedв любом случае, неоднократно вызывал частично видимый столбец?Возможно, я смогу устранить причину этого.

  2. Внутри 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;
    }

1 Ответ

0 голосов
/ 18 июня 2018

Глядя на документацию MSDN для CellValueNeeded, она выглядит так, как будто это стандартное визуальное событие, просто срабатывает, как только ячейка становится "видимой", я не думаю, что она определяет логикуиспользует, чтобы понять визуальную пристрастность.Просто кажется, что он пытается подготовиться к тому, чтобы клетка стала полностью «на виду».Я подозреваю, что никакие промежуточные состояния не раскрыты.

При этом есть некоторые предложения здесь (SO ответ) и здесь (странный веб-блог), в которых упоминается использованиеDataGridView.GetColumnDisplayRectangle с целью определения того, находится ли прямоугольник ячейки в пределах экрана.

Вот фрагмент веб-блога:

Второй параметр дляGetColumnDisplayRectangle называется CutOverFlow, который является логическим значением, определяющим, возвращает ли функция полный прямоугольник столбца (даже если столбец не полностью виден) или только видимую часть прямоугольника столбца.

Путем вызоваэтот метод дважды, один раз с CutOverFlow, установленным в true, и один раз с установленным в false, вы можете создать функцию, которая сравнивает результаты и возвращает логическое значение, когда столбец виден только частично:

Return dg.GetColumnDisplayRectangle(columnindex, False) .Width = _
dg.GetColumnDisplayRectangle (columnindex,True) .Width

Это позволит вам прекратить обработку при вызове grid_Data_CellValueNeeded, и приведенное выше вернет false в зависимости от местоположения последней ячейки.

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