Deleting a bound DataGridView row?

M

Michael Wong

I have a DataGridView which is bound to a dataset.

When I delete rows from the DataGridView, should it delete the same rows
from the dataset also?
I have tried the following code, but apparently, the dataset isn't
updated. Did I miss (understood) something?

for(int i = 0; i < dataGridView.SelectedRows.Count; i++)
{
DataGridViewRow row = dataGridView.SelectedRows;
dataGridView.Rows.Remove(row);
}

Debug.WriteLine(myTypedDataset.myTypedDataTable.Rows.Count.ToString());
// Here, the count is the same as before the deletion, but when
// accessing the dataTable rows, a
// DeletedRowInaccessibleException occurs on the deleted rows
 
B

Bart Mermuys

Hi,

Michael Wong said:
I have a DataGridView which is bound to a dataset.

When I delete rows from the DataGridView, should it delete the same rows
from the dataset also?
I have tried the following code, but apparently, the dataset isn't
updated. Did I miss (understood) something?

for(int i = 0; i < dataGridView.SelectedRows.Count; i++)
{
DataGridViewRow row = dataGridView.SelectedRows;
dataGridView.Rows.Remove(row);
}


This will delete the DataRows, but once you remove a DataGridViewRow from
dataGridView.Rows, then it will also be removed from SelectedRows, so the
SelectedRows.Count will decrease and not all SelectedRows will be deleted.

Use something like:
while (tbl_masterDataGridView.SelectedRows.Count > 0)
tbl_masterDataGridView.Rows.Remove(tbl_masterDataGridView.SelectedRows[0]);
Debug.WriteLine(myTypedDataset.myTypedDataTable.Rows.Count.ToString());
// Here, the count is the same as before the deletion, but when
// accessing the dataTable rows, a
// DeletedRowInaccessibleException occurs on the deleted rows

That's both normal, deleted rows are still visible inside the DataTable.Rows
collection, but if you want to access their data then you must use an
overloaded version of DataRow[] which takes a DataRowVersion. Because
deleted rows only have an Original row version, example:

foreach (DataRow dr in myTypedDataset.myTypedDataTable.Rows)
{
Console.Write(dr.RowState + " ");
foreach (DataColumn dc in myTypedDataset.myTypedDataTable.Columns)
{
if (dr.RowState == DataRowState.Deleted)
Console.Write(dr[dc, DataRowVersion.Original]+" ");
else
Console.Write(dr[dc]+ " ");
}
Console.WriteLine();
}

The deleted rows will be removed from the DataTable.Rows collection once you
perform a DataAdapter.Update or a DataTable.AcceptChanges (but don't do this
if you're planning to do a DataAdapter.Update).


HTH,
Greetings
 
C

Cor Ligthert [MVP]

Use something like:
while (tbl_masterDataGridView.SelectedRows.Count > 0)

tbl_masterDataGridView.Rows.Remove(tbl_masterDataGridView.SelectedRows[0]);
Or use the For index backwards

for(int i = dataGridView.SelectedRows.Count; i < 0; i--)

Cor
 
J

Joanna Carter [TeamB]

"Cor Ligthert [MVP]" <[email protected]> a écrit dans le message de
OKy%[email protected]...

| for(int i = dataGridView.SelectedRows.Count; i < 0; i--)

or possibly

for(int i = dataGridView.SelectedRows.Count; i > 0; i--)

might work better :))

Joanna
 
C

Cor Ligthert [MVP]

| for(int i = dataGridView.SelectedRows.Count; i < 0; i--)
or possibly

for(int i = dataGridView.SelectedRows.Count; i > 0; i--)

might work better :))
Without any doubt

:)

Cor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top