Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: Deleted row information cannot be accessed through the row

To whom this may concern, I have searched a considerable amount of time, to work a way out of this error

"Deleted row information cannot be accessed through the row"

I understand that once a row has been deleted from a datatable that it cannot be accessed in a typical fashion and this is why I am getting this error. The big issue is that I am not sure what to do to get my desired result, which I will outline below.

Basically when a row in "dg1" is deleted the row beneath it takes the place of the deleted row (obviously) and thus inherits the deleted rows index. The purpose of this method is to replace and reset the rows index (via grabbing it from the corresponding value in the dataset) that took the deleted rows place and as such the index value.

Right now I am just using a label (lblText) to try and get a response from the process, but it crashes when the last nested if statement trys to compare values.

Here is the code:

void dg1_Click(object sender, EventArgs e)
    {
        rowIndex = dg1.CurrentRow.Index; //gets the current rows
        string value = Convert.ToString(dg1.Rows[rowIndex].Cells[0].Value);

        if (ds.Tables[0].Rows[rowIndex].RowState.ToString() == "Deleted")
        {

            for (int i = 0; i < dg1.Rows.Count; i++)
            {

                if (Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
                // ^ **where the error is occurring**
                {
                    lblTest.Text = "Aha!";
                    //when working, will place index of compared dataset value into                                   rowState, which is displaying the current index of the row I am focussed on in 'dg1'
                }
            }
        }

Thanks ahead of time for the help, I really did search, and if it is easy to figure out through a simple google search then allow myself to repeatably hate on me, because I DID try.

  • gc
like image 285
zillaofthegods Avatar asked Dec 01 '10 06:12

zillaofthegods


3 Answers

You can also use the DataSet's AcceptChanges() method to apply the deletes fully.

ds.Tables[0].Rows[0].Delete();
ds.AcceptChanges();
like image 135
Gavin Avatar answered Oct 30 '22 07:10

Gavin


The current value for the data column in the inner if statement will not be available for deleted rows. To retrieve a value for deleted rows, specify that you want the original value. This should fix your error:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value)
like image 33
firedfly Avatar answered Oct 30 '22 06:10

firedfly


In your "crashing if", you can check if the row is deleted before accessing it's values :

if (ds.Tables[0].Rows[i].RowState != DataRowState.Deleted &&
    Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value)
{
    // blaaaaa
}

Also, I'm not sure why you ToString() the RowState instead of comparing it to DataRowState.Deleted.

like image 16
Tipx Avatar answered Oct 30 '22 06:10

Tipx