DatagridView Выбрать последнюю строку - PullRequest
9 голосов
/ 28 сентября 2010

У меня возникли проблемы с настройкой последней строки в моем выбранном сетевом представлении.Я выбираю последнюю строку следующим образом:

if (grid.Rows.Count > 0)
{
    try
    {
        grid.Rows[grid.Rows.Count - 1].Selected = true;
        grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1]
    }
    catch (IndexOutOfRangeException)
    { }
    catch (ArgumentOutOfRangeException)
    { }
}

Когда я выполняю этот код, я получаю исключение: IndexOutOfRangeException occurred: у Index-1 нет значения.

Когда я отлаживаюRows коллекция и соответствующая Cells коллекция, которую я вижу, обе коллекции заполнены.Существует также индекс коллекции Rows and Cells.

Я понятия не имею, что я делаю здесь неправильно.Кто-то, кто может помочь мне здесь?Thnx

РЕДАКТИРОВАТЬ:

Вот полное исключение:

System.IndexOutOfRangeException: Index -1 does not have a value.
at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
at System.Windows.Forms.CurrencyManager.get_Current()
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
at System.Windows.Forms.DataGridView.set_CurrentCell(DataGridViewCell value)

Ответы [ 7 ]

14 голосов
/ 28 сентября 2010

Попробуйте:

dataGridView1.ClearSelection();//If you want

int nRowIndex = dataGridView1.Rows.Count - 1;
int nColumnIndex = 3;

dataGridView1.Rows[nRowIndex].Selected = true;
dataGridView1.Rows[nRowIndex].Cells[nColumnIndex].Selected = true;

//In case if you want to scroll down as well.
dataGridView1.FirstDisplayedScrollingRowIndex = nRowIndex;

Дает следующий вывод : (последняя строка прокручивается и выбирается)

alt text

4 голосов
/ 27 сентября 2011

Я знаю, что это может быть немного поздно, но это может быть полезно кому-то еще.

Вы пробовали это:

grid.Rows.Row[grid.Rows.Count -1].Selected = true;

В моих окнахприложение Я впервые использовал ваш код в моем datagridview, и я получил то же исключение .. а потом он пришел ко мне ночью, когда я лежал в постели (я новичок в программировании).

Если я пишукак: Rows[Rows.count-1] первая строка "0" и "0-1 = -1", поэтому она выходит за пределы диапазона:)

Затем, когда я изменил свой код на Rows.Row[index], это сработало!:)


Альтернатива, если вы используете c # 3.0 и выше: проверьте CellAddress ();;)

С уважением

2 голосов
/ 28 сентября 2010

Вы думали об использовании Linq для этого?

    grid.Rows.OfType<DataGridViewRow>().Last().Selected = true;
    grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().First(); // if first wanted
1 голос
/ 28 сентября 2010

Ваш блок 'catch' для IndexOutOfRangeException пуст и не будет отображать никаких ошибок вообще.

Либо ваш вопрос не точный, либо исключение выдается где-то еще.

РЕДАКТИРОВАТЬ: Просматривая ваш стек вызовов, который вы добавили, я вижу, что ошибка действительно не здесь, а скорее в CurrencyManager Current / Item свойств, которые в конечном итоге запускаются вызовом установщика CurrentCell.

Итог: проблема не в этом коде; исключение выдается каким-то другим фрагментом кода, вызванным настройкой текущей ячейки.

0 голосов
/ 14 марта 2019

Чтобы избежать исключения IndexOutOfRangeException, выбирайте только видимую строку.Я предлагаю:

// Find last visible row
DataGridViewRow row = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r.Visible).Last(); 
// scroll to last row if necessary
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.IndexOf(row);
// select row
row.Selected = true;
0 голосов
/ 11 мая 2018
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
0 голосов
/ 28 сентября 2010

В конце концов, последняя строка пуста, потому что это пустая строка, с которой пользователь может добавить новую строку.Этот ряд не может быть выбран.Вы пробовали grid.Rows.Count - 2?В качестве альтернативы вы можете установить значение AllowUserToAddRows в false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...