Мы можем использовать SelectionChanged
событие DataGridView
для отслеживания выбранной строки. Проблема в том, что при повторном связывании источника данных CurrentRow.Index
сбрасывается в ноль.
Мы можем справиться с этим, отсоединившись от события SelectionChanged
перед привязкой нашего источника данных и повторно подключив его к событию после привязки нашего источника данных.
// Detach Event
dataGridView1.SelectionChanged -= dataGridView1_SelectionChanged;
// Bind Data
bindingSource.DataSource = data; // or dataGridView1.DataSource = data;
// Set Selected Row
dataGridView1.Rows[LastSelectedRowIndex].Selected = true;
// Re-attach Event
dataGridView1.SelectionChanged += dataGridView1_SelectionChanged;
Событие для отслеживания выбранного индекса простое.
int LastSelectedRowIndex = 0;
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
LastSelectedRowIndex = dataGridView1.CurrentRow.Index;
}
Это должно дать вам представление о концепции.
Сохранение выбора с уникальным значением ключа
Обычно, когда мы привязываем информацию к источнику данных, это происходит потому, что информация изменилась. Если размер набора данных изменился, это означает, что ваши индексы строк также изменятся.
Вот почему мы не должны полагаться на LastSelectedRowIndex
для поддержки выбранной строки. Вместо этого мы должны использовать уникальный ключ в источнике данных.
Наше SelectionChanged
событие становится следующим.
// KeyIndex is the Unique Key column within your dataset.
int KeyIndex = 2;
string LastSelectedKey = string.Empty;
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
LastSelectedKey = dataGridView1.CurrentRow.Cells[KeyIndex].Value.ToString();
}
И вместо установки DataGridView
выбранной строки по индексу мы можем установить ее по значению ключа.
// Set Selected Row
// If we need to scroll the selected row into view
// this would be a good place to set FirstDisplayedScrollingRowIndex
foreach (DataGridViewRow row in dataGridView1.Rows)
if (row.Cells[KeyIndex].Value.ToString() == LastSelectedKey)
row.Selected = true;