Как установить индекс текущей строки в datagridview?

637
10 августа 2017, 21:05

Программно выделяю строку в гриде:

 int i=10; //(пусть будет 10, это не важно)
 DatagridView_MAIL.Rows[i].Selected = True;

Отрабатывает событие SelectionChanged в гриде. CurrentRow.Index равно нулю... помогите , пожалуйста, понять почему не 10. И каким образом мне не только выделить строку с индексом 10, но и в свойство CurrentRow.Index записать 10?

Answer 1

При изменении свойства 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];
    }
}
Answer 2

CurrentRow возвращает строку в которой находится активная ячейка (CurrentCell). Выделение строки/строк не изменяет текущую активную ячейку.

Попробуйте установить активную ячейку напрямую:

//допустим ячейка в первом столбце 11-й строки
DatagridView_MAIL.CurrentCell = DatagridView_MAIL.Rows[10].Cells[0];
Answer 3

DataGridView есть свойство CurrentCell а у него RowIndex.
В обработчике собития SelectionChanged найдете индекс выбранной строки таким образом:

datagridview.CurrentCell.RowIndex
READ ALSO
Как получить доступ к страницам navigationPage NavigationFrame

Как получить доступ к страницам navigationPage NavigationFrame

Используется Visual Studio 2015; Devexpress 171

367
Получение списка всех пользователей

Получение списка всех пользователей

Есть терминальный сервер нужно: 1Программно получить список всех пользователей запущенных на компьютере (как в диспетчере задач Windows) 2

313
Удаление разделов реестра в цикле

Удаление разделов реестра в цикле

Подскажите можно как-нибудь удалить разделы реестра используя List<string> ?

441
Ajax.BeginForm не правильно конструирует Action?

Ajax.BeginForm не правильно конструирует Action?

Есть форма для добавления товара в корзину:

331