Как предовратить прокрутку при добавлении данных в DataGridView

Приложение Windows Forms. Есть DataGridView с привязанной коллекцией элементов. При добавлении нового элемента в начало списка, датагрид автоматически прикручивается на этот элемент. Как отключить автоматическую прокрутку?

1 ответов


Вместо привязанной коллекции можно использовать VirtualMode. В нем в DataGridView отображается только содержимое буфера, а не всей коллекции. При прокрутке, элементы вызываются из буфера (или подгружаются из коллекции) и выводятся в виджет. Когда их нет на экране, в виджете их тоже нет.
http://msdn.microsoft.com/ru-ru/library/system.windows.forms.datagridview.virtualmode.aspx


Доброго времени суток ребята! Вот кусок кода в котором ошибка..немогу понять в чем?


        private void saveSelectedCells()
         {
             selectedSells.Clear();
             for (int i = 0; i < dataGridView.SelectedCells.Count; i++)
             {
                 selectedSells.Add(new CellIndex()
                 {
                     RowIndex = dataGridView.SelectedCells[i].RowIndex,
                     ColumnIndex = dataGridView.SelectedCells[i].ColumnIndex
                 });
             }
         }

 

Error 1 Invalid token '(' in class, struct, or interface member declaration C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 24 55 WindowsApplication2
Error 2 Invalid token '(' in class, struct, or interface member declaration C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 28 51 WindowsApplication2
Error 3 Invalid token ')' in class, struct, or interface member declaration C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 28 64 WindowsApplication2
Error 4 ) expected C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 85 51 WindowsApplication2
Error 5 ; expected C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 85 51 WindowsApplication2
Error 6 ; expected C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 87 71 WindowsApplication2
Error 7 Invalid expression term ',' C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 87 71 WindowsApplication2
Error 8 ; expected C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 87 72 WindowsApplication2
Error 9 ; expected C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 88 77 WindowsApplication2
Error 10 Invalid expression term ')' C:\Users\x\Documents\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form1.cs 89 19 WindowsApplication2

После долгих мучений решение было найдено и даже был написан небольшой класс.


    /// <summary>
    /// Позволяет запоминать и восстанавливать позицию полосы прокрутки и выделенные ячейки в DataGridView.
    /// </summary>
    public class DataGridViewScrollHelper
    {
        struct CellIndex
        {
            public int RowIndex;
            public int ColumnIndex;
        }

        DataGridView dataGridView;
        List<CellIndex> selectedSells = new List<CellIndex>();
        int displayedIndex = 0;

        public DataGridViewScrollHelper(DataGridView dataGridView)
        {
            this.dataGridView = dataGridView;
        }

        /// <summary>
        /// Запомнить позицию полосы прокрутки и выделенные ячейки.
        /// </summary>
        public void SaveCurrentScrollPosition()
        {
            displayedIndex = dataGridView.FirstDisplayedScrollingRowIndex;

            saveSelectedCells();
        }

        /// <summary>
        /// Восстановить позицию полосы прокрутки и выделенные ячейки.
        /// </summary>
        /// <param name="newRowsCount">Количество новых рядов в источнике данных, с момента последнего вызова SaveCurrentScrollPosition()</param>
        public void RestoreScrollPosition(int newRowsCount)
        {
            dataGridView.FirstDisplayedScrollingRowIndex = displayedIndex + newRowsCount;

            restoreSelectedCells(newRowsCount);
        }

        #region Private Methods

        private void saveSelectedCells()
        {
            selectedSells.Clear();
            for (int i = 0; i < dataGridView.SelectedCells.Count; i++)
            {
                selectedSells.Add(new CellIndex()
                {
                    RowIndex = dataGridView.SelectedCells[i].RowIndex,
                    ColumnIndex = dataGridView.SelectedCells[i].ColumnIndex
                });
            }
        }

        private void restoreSelectedCells(int newRowsCount)
        {
            dataGridView.ClearSelection();
            foreach (var cell in selectedSells)
            {
                var newRowIndex = cell.RowIndex + newRowsCount;
                if (newRowIndex >= 0 && newRowIndex < dataGridView.Rows.Count)
                    dataGridView.Rows[newRowIndex].Cells[cell.ColumnIndex].Selected = true;
            }
        }

        #endregion // Private Methods
    }
 

Использование:

DataGridViewScrollHelper dataGridScrollHelper =
         new DataGridViewScrollHelper(dataGrid); // dataGrid - DataGridView для которого нужно запоминать состояние скрола.

//...

dataGridScrollHelper.SaveCurrentScrollPosition();

//... обновление dataGrid.DataSource

dataGridScrollHelper.RestoreScrollPosition(newRowsCount); // newRowsCount - количество новых строк в DataSource. Проверял только для положительных значений.