Как узнать, какие строки DataGridView в данный момент находятся на экране?

#c# #datagridview #virtualmode

#c# #datagridview #виртуальный режим

Вопрос:

В моем приложении на C # (2010) у меня есть DataGridView в виртуальном режиме, который содержит несколько тысяч строк. Возможно ли узнать, какие ячейки находятся на экране в данный момент?

Ответ №1:

 public void GetVisibleCells(DataGridView dgv)
    {
        var visibleRowsCount = dgv.DisplayedRowCount(true);
        var firstDisplayedRowIndex = dgv.FirstDisplayedCell.RowIndex;
        var lastvisibleRowIndex = (firstDisplayedRowIndex   visibleRowsCount) - 1;
        for (int rowIndex = firstDisplayedRowIndex; rowIndex <= lastvisibleRowIndex; rowIndex  )
        {
            var cells = dgv.Rows[rowIndex].Cells;
            foreach (DataGridViewCell cell in cells)
            {
                if (cell.Displayed)
                {
                    // This cell is visible...
                    // Your code goes here...
                }
            }
        }
    }
  

Обновлено: теперь он находит видимые ячейки.

Комментарии:

1. ВНИМАНИЕ: Вы не можете вычислить lastvibileRowIndex подобным образом, если у вас есть невидимые строки в сетке. В таком случае вы должны проверить свойство Visible строки в цикле for и считать эти видимые строки, пока не достигнете vivibleRowsCount.

Ответ №2:

Я сам этого не пробовал, но мне кажется, что правильным решением было бы определить прямоугольник строки с помощью DataGridView.GetRowDisplayRectangle и проверить, перекрывается ли он с текущим DataGridView.DisplayRectangle. Прямоугольник.Для этого полезно использовать IntersectsWith.

В качестве оптимизации я бы использовал DataGridView .DisplayedRowCount после нахождения первой видимой строки, чтобы определить, какие строки видны.

Ответ №3:

     private bool RowIsVisible(DataGridViewRow row)
    {
        DataGridView dgv = row.DataGridView;
        int firstVisibleRowIndex = dgv.FirstDisplayedCell.RowIndex;
        int lastVisibleRowIndex = firstVisibleRowIndex   dgv.DisplayedRowCount(false) - 1;
        return row.Index >= firstVisibleRowIndex amp;amp; row.Index <= lastVisibleRowIndex;
    }
  

ИМХО
С уважением

Комментарии:

1. Добро пожаловать в SO. Пожалуйста, объясните, как это добавляет что-либо к принятому ответу от 2011 года и как это относится к комментарию, сделанному к нему в 2014 году о невидимых строках.