Программно выделяю строку в гриде:
int i=10; //(пусть будет 10, это не важно)
DatagridView_MAIL.Rows[i].Selected = True;
Отрабатывает событие SelectionChanged в гриде. CurrentRow.Index равно нулю... помогите , пожалуйста, понять почему не 10. И каким образом мне не только выделить строку с индексом 10, но и в свойство CurrentRow.Index записать 10?
При изменении свойства DataGridViewRow.Selected, также меняется свойство DataGridViewRow.State. Изменение значения DataGridViewRow.State активирует событие DataGridView.RowStateChanged.
В аргументах события есть свойство DataGridViewRowStateChangedEventArgs.Row, через которое, вы получаете прямую ссылку на объект DataGridViewRow, представляющий выделенную строку.
В обработчике нужно поставить фильтр, чтобы срабатывание происходило только при выделении, например так:
private void DataGridView1_RowStateChanged(Object sender, DataGridViewRowStateChangedEventArgs e)
{
if(e.StateChanged == DataGridViewElementStates.Selected)
{
var selectedRow = e.Row;
//что-то делаем с выбранной строкой
}
}
Естественно, если вам нужно обрабатывать и другие состояния строк, то логику фильтра придется менять.
Отдельно надо заметить, что при таком способе выделения строки, не меняется выделенная ячейка, и соответственно не меняется связанное свойство DataGridViewRow.CurrentRow, что и является причиной того, что вы не могли получить нужный индекс.
Если вам нужно чтобы изменилось именно свойство DataGridViewRow.CurrentRow, то нужно выделить любую ячейку, интересующей вас строки с помощью свойства DataGridView.CurrentCell.
При использовании текущего способа выделения строки нужно немного изменить обработчик события.
private void DataGridView1_RowStateChanged(Object sender, DataGridViewRowStateChangedEventArgs e)
{
if(e.StateChanged == DataGridViewElementStates.Selected)
{
var selectedRow = e.Row;
dataGridView1.CurrentCell = e.Row.Cells[0];
}
}
CurrentRow возвращает строку в которой находится активная ячейка (CurrentCell). Выделение строки/строк не изменяет текущую активную ячейку.
Попробуйте установить активную ячейку напрямую:
//допустим ячейка в первом столбце 11-й строки
DatagridView_MAIL.CurrentCell = DatagridView_MAIL.Rows[10].Cells[0];
DataGridView есть свойство CurrentCell а у него RowIndex.
В обработчике собития SelectionChanged найдете индекс выбранной строки таким образом:
datagridview.CurrentCell.RowIndex
Продвижение своими сайтами как стратегия роста и независимости