Как предовратить прокрутку при добавлении данных в 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. Проверял только для положительных значений.