В прошлой статье о слежении ячейки за курсором мыши и получение текущей строки в DataGridView мы достаточно легко вітягивали из грида текущую строку, то есть активную запись.
Но существуют проблемные ситуации, корда такие подходы сработаю не правильно. Что имеется в виду.
К примеру есть DataSetс несколькими таблицями. Некоторый DataGridView мы биндим на одну из таблиц датасета. Перемещаясь по гриду мы можем перемещаться соответственно и по связанной таблице. Но вот если DataGridView поддерживает сортировку по значениям одного, или нескольких столбцов. Получается, что после сортировки номер активной строки грида уже не будет соответствовать той же строки в DataTable c тем же номером. Ведь строки в гриде сортируются без вовлечения в этот процесс исходный DataTable.
Выход все же есть, как всегда.
В данном случае будем использовать тип CurrencyManager. Он обеспечивает процесс связывания с исходными данными. С помощью данного класса мы реализуем возможность перемещения по записям грида в любом режиме отображения (фильтрация, сортировка и т.д).
Для демонстрации работы кода, подпишемся на событие MouseClick для грида:
private void dgv_MouseClick(object sender, MouseEventArgs e)
{
CurrencyManager cManager =
dg.BindingContext[dgv.DataSource, dgv.DataMember]
as CurrencyManager;
if (cManager == null || cManager.Count == 0)
return null;
DataRowView drv = (DataRowView)cManager.Current;
return drv.Row;
}
Если хотите получить универсальный метод для любого DataGridView:
public DataRow FindCurrentRow(DataGridView dgv)
{
CurrencyManager cManager =
dg.BindingContext[dgv.DataSource, dgv.DataMember]
as CurrencyManager;
if (cManager == null || cManager.Count == 0)
return null;
DataRowView drv = cManager.Current as DataRowView;
return drv.Row;
}
Использовать метод просто:
private void dgv_MouseClick(object sender, MouseEventArgs e)
{
DataRow dRow = Find(dgv);
MessageBox.Show(dr[1].ToString());
}
Свойство CurrencyManager.Current представляет значение текущего объекта в датасурсе.
* Запись dr[1] представляет данные второго столбца строки.