Martijn
Martijn

Reputation: 24789

DatagridView Select last row

I have some trouble with setting the last row in my datagridview selected. I select the last row this way:

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)
    { }
}

When I execute this code I get an exception: IndexOutOfRangeException occurred: Index-1 does not have a value.

When I debug the Rowscollection and the corresponding Cells collection I see both collections are filled. The index also exists of the Rows and Cells collection.

I have no clue what I am doing wrong here. Someone who can help me out here? Thnx

EDIT:

Here is the complete exception:

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)

Upvotes: 10

Views: 80596

Answers (8)

mehrdad safa
mehrdad safa

Reputation: 1071

It's very easy. use: dataGridView.CurrentCell=dataGridView[ColumnIndex, RowIndex];
dataGridView[X,y]...
instead of
dataGridView[Y, X]...

Upvotes: 0

zeitgeist02
zeitgeist02

Reputation: 1

To avoid the IndexOutOfRangeException make sure only to select a visible row. I suggest:

// 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;

Upvotes: 0

Ozkan Konca
Ozkan Konca

Reputation: 115

dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;

Upvotes: 1

sihirbazzz
sihirbazzz

Reputation: 718

I know this may be a little late but it may be of use to someone else.

Have you tried this :

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

In my windows app I first used your code in my datagridview and I got the same exception.. and then it came to me at night when I was in my bed (I'm a newbie to programming).

If I write as : Rows[Rows.count-1] the first row is "0" and "0-1 = -1" so its out of range :)

Then when I changed my code to Rows.Row[index] it worked! :)


An alternative if you use c# 3.0 and higher: check out CellAddress(); ;)

Sincerely

Upvotes: 4

Shaul Behr
Shaul Behr

Reputation: 38003

Your 'catch' block for IndexOutOfRangeException is empty, and will not display any error at all.

Either your question is not exact, or the exception is being thrown somewhere else.

EDIT: Having looked through your call stack that you added, I can see that the error is, indeed, not being thrown here, but rather in the CurrencyManager class's Current/Item properties, which is ultimately being triggered by the call to the CurrentCell setter.

Bottom line: the problem is not in this code; the exception is being thrown by some other piece of code triggered by your setting the current cell.

Upvotes: 1

Kamran Khan
Kamran Khan

Reputation: 9986

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;

Gives following output: (Last row, scrolled and selected)

alt text

Upvotes: 19

danijels
danijels

Reputation: 5291

Have you thought about using Linq for this?

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

Upvotes: 3

Jan-Patrick Ahnen
Jan-Patrick Ahnen

Reputation: 1460

Eventually the last row is empty because it's the empty row with which the user can add a new row. This row cannot be selected. Have you tried grid.Rows.Count - 2? As an alternative, you can set AllowUserToAddRows to false.

Upvotes: 0

Related Questions