Ошибка: удаленная информация о строке не может быть доступна через строку - PullRequest
31 голосов
/ 01 декабря 2010

Кому это может касаться, я искал значительное количество времени, чтобы найти выход из этой ошибки

«Информация об удаленной строке не может быть доступна через строку»

Я понимаю, что после удаления строки из таблицы данных к ней нельзя получить доступ обычным способом, и именно поэтому я получаю эту ошибку. Большая проблема в том, что я не уверен, что делать, чтобы получить желаемый результат, о котором я расскажу ниже.

Обычно, когда строка в «dg1» удаляется, строка под ней занимает место удаленной строки (очевидно) и, таким образом, наследует индекс удаленных строк. Целью этого метода является замена и сброс индекса строк (путем его извлечения из соответствующего значения в наборе данных), который занял место удаленных строк и, как таковое, значения индекса.

Сейчас я просто использую метку (lblText), чтобы попытаться получить ответ от процесса, но он падает, когда последний вложенный оператор if пытается сравнить значения.

Вот код:

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'
                }
            }
        }

Заранее спасибо за помощь, я действительно выполнил поиск, и, если с помощью простого поиска в Google легко разобраться, позвольте мне неоднократно ненавидеть меня, потому что я ДЕЙСТВИТЕЛЬНО пытался.

  • дс

Ответы [ 4 ]

45 голосов
/ 17 июня 2011

Вы также можете использовать метод AcceptChanges () объекта DataSet для полного удаления.

ds.Tables[0].Rows[0].Delete();
ds.AcceptChanges();
35 голосов
/ 02 декабря 2010

Текущее значение для столбца данных во внутреннем операторе if не будет доступно для удаленных строк.Чтобы получить значение для удаленных строк, укажите, что вы хотите исходное значение.Это должно исправить вашу ошибку:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value)
13 голосов
/ 02 декабря 2010

В «аварийном случае if» вы можете проверить, удалена ли строка перед доступом к ее значениям:

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

Кроме того, я не уверен, почему вы используете ToString () RowState вместо того, чтобы сравнивать его с DataRowState.Deleted.

0 голосов
/ 01 декабря 2010

после удаления строки перепривязать свою сетку с датируемой таблицей, нет необходимости вручную сбрасывать индекс, датируемая обрабатывает его.

, поэтому вам нужно перепривязать источник данных сетки.

...