2010-09-28 3 views
7

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

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

EDIT:

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

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) 
+0

код кажется нормально. Вы пробовали отлаживать его? На какой строке кода вы получаете ошибку? –

+0

Попробуйте ** Быстрый просмотр ** для 'grid.Rows [grid.Rows.Count - 1] .Cells [1]' и посмотреть, что он возвращает. –

+0

@Aseem: строка: 'grid.CurrentCell = grid.Rows [grid.Rows.Count - 1] .Cells [1]' – Martijn

ответ

1

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

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

EDIT: Посмотрев через стек вызовов, который был добавлен, я могу видеть, что ошибка, на самом деле, не быть брошенным здесь, а в Current/Item свойств CurrencyManager класса, который в конечном счете является вызванный вызовом устройства CurrentCell.

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

+0

. Он бросает excetpion в режиме отладки. Код перестает работать, а VS выделяется. Но дело не в этом. Дело в том, ПОЧЕМУ это исключение? – Martijn

+0

Я бы использовал окно «Немедленное», чтобы подтвердить значение grid.Rows.Count, а затем попытаться получить доступ к grid.Rows [0] или любому номеру, используя целочисленный литерал, чтобы убедиться. Я подозреваю, что код здесь не является точной копией кода, вызывающего исключение, и где-то посередине это и то, что вы думаете * ваш код делает ложью ошибку. –

+0

В ближайшем окне у меня есть строки и ячейки в коллекциях. – Martijn

2

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

grid.Rows.OfType<DataGridViewRow>().Last().Selected = true; 
    grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().First(); // if first wanted 
+0

Нет, нет. Но у меня нет методов расширения 'Last()' и 'First()'. У меня есть System.Linq – Martijn

+0

извините, я отредактировал для исправления linq сейчас – danijels

+0

Спасибо. Пробовал ваше решение, но в этой строке получаю одно и то же Исключение: 'grid.CurrentCell = grid.Rows.OfType (). Last(). Cells.OfType (). Last();' – Martijn

-1

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

+0

Я пробовал ваше решение, но это не сработало. – Martijn

+0

У меня уже есть свойство, установленное на false. – Martijn

+0

-1 - это называется сжиманием на соломинках, а не отладки. –

11

Try:

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

+0

Я пробовал это, но это не сработало. – Martijn

+0

@Martijn: Я проверил код перед публикацией. Что именно не работает? –

+0

В строке 'dataGridView1.Rows [nRowIndex] .Cells [nColumnIndex] .Selected = true; 'Я получаю раздражающее исключение – Martijn

4

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

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

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(); ;)

С уважением

Смежные вопросы