I use button for by clicking it to delete one row in the DataGridView. This is the code:

DataGridView.Rows.RemoveAt(DataGridView.CurrentCell.RowIndex);

I use xml file as the source of dataset which is sourcedata of the DataGridView. It makes problems when I delete last row. What can I do?

pls, help

Dani AI

Generated

You are hitting the special asterisk row that appears when AllowUserToAddRows is true. That row is always last and is not a real data row, so it cannot be deleted. The reliable way to tell them apart is DataGridViewRow.IsNewRow. If you do not need users to add rows, you can turn the asterisk row off by setting AllowUserToAddRows = false. was right to ask for the exact error because attempting to treat the new-row as data typically triggers an InvalidOperationException. See Microsoft’s notes on the new-row behavior and the property docs. Using the row for new records, AllowUserToAddRows, IsNewRow.

Safe delete of the selected row (works for bound and unbound grids). Commit any in-progress edits, then skip the new-row:

var grid = dataGridView1;
if (grid.CurrentRow == null || grid.CurrentRow.IsNewRow) return;

var bs = grid.DataSource as BindingSource;
if (bs != null)
{
    bs.EndEdit();          // commit editor changes
    bs.RemoveCurrent();    // removes from the underlying list/DataTable
}
else
{
    grid.Rows.Remove(grid.CurrentRow);
}

To delete the last actual data row even when the asterisk row is visible, walk back from the last visible row and skip the new-row:

int i = dataGridView1.Rows.GetLastRow(DataGridViewElementStates.Visible);
while (i >= 0 && dataGridView1.Rows[i].IsNewRow)
    i = dataGridView1.Rows.GetPreviousRow(i, DataGridViewElementStates.Visible);

if (i >= 0) dataGridView1.Rows.Remove(dataGridView1.Rows[i]);

If your grid is bound (e.g., to a DataSet loaded from XML), prefer deleting via the BindingSource as above; , bound rows can be deleted when the data source allows it. BindingSource overview (RemoveCurrent, EndEdit), GetPreviousRow/GetLastRow, EndEdit commits pending edits.

Recommended Answers

All 12 Replies

Sure you want RowIndex? not RowIndex - 1?

Whats the error and did you really need to spam so many different questions, as they are all based around the same subject.. you could have placed them 1 by 1

I'm sorry for spamming, won't happen again. I'm very new person in this forum and programming forum in general...

Even though, I'm not sure, that rowindex-1 is the answer for my question because rowindex points on the the exact row of the table. The deletions of other rows are successful with no errors.

You havent explained the problem of the last row, the reason I wonder about -1 is becaue of the 0 based array/list properties.

What is the error you get? Is there any other code you have around that line?

hi
if u want to delete row
give like this

dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);

Yes, I know, that deleting row according to currentcellindex works, but what if your selection is on the very last row in case that your property that allows users to add rows is on? That means that there are as if two last rows, one of them is traditional with some data like name, surname, age,... etc. with index [10,10], but when I tried to display the index of the row that functions to add new row via messagebox, it showed me [10,10] again. How can I distinguish between them? That one of them is impossible to delete because it serves for another purpose than displaying data from datasource?

Yes, I know, that deleting row according to currentcellindex works, but what if your selection is on the very last row in case that your property that allows users to add rows is on? That means that there are as if two last rows, one of them is traditional with some data like name, surname, age,... etc. with index [10,10], but when I tried to display the index of the row that functions to add new row via messagebox, it showed me [10,10] again. How can I distinguish between them? That one of them is impossible to delete because it serves for another purpose than displaying data from datasource?

hi im expecting more expl if u have patients

Would not the row index be higher than the record count?

OK, let's close this discussion. Seems I'm confusing and complicating things alot. I used the usual way to delete: select row by clicking on row header and then hit delete.

Some things also were not working properly with my datasource and I had some raising exceptions but now it's fixed.

Let's say, that the answer is:

DataGridView.Rows.RemoveAt(DataGridView.CurrentCell.RowIndex);

It really works also when the property for adding rows is set on true as I now tried that. I don't know why it now works, but probably the problem was in my chaotic solutions for dataset as the datasource for datagridview.

I'm sorry.

DataGridView.Rows.RemoveAt(DataGridView.LastRpw);

commented: Don't bump old threads -1

dataGridView1.Rows.RemoveAt(dataGridView1.Rows[dataGridView1.Rows.GetLastRow(0)].Index);

dataGridView1.Rows.RemoveAt(dataGridView1.Rows[dataGridView1.Rows.GetLastRow(0)].Index);

if the datagrid is bounded to datasource then u cant delete any of rows , i think

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.