Ошибка: удаленная информация о строке не может быть доступна через строку
Для кого это может касаться, я искал значительное количество времени, чтобы найти выход из этой ошибки
"Информация об удаленной строке не может быть доступна через строку"
Я понимаю, что после удаления строки из таблицы данных к ней нельзя получить доступ обычным способом, и именно поэтому я получаю эту ошибку. Большая проблема в том, что я не уверен, что делать, чтобы получить желаемый результат, о котором я расскажу ниже.
В основном, когда строка в "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 ответа
Текущее значение для столбца данных во внутреннем операторе if не будет доступно для удаленных строк. Чтобы получить значение для удаленных строк, укажите, что вы хотите исходное значение. Это должно исправить вашу ошибку:
if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value)
Вы также можете использовать метод AcceptChanges() объекта DataSe t для полного удаления.
ds.Tables[0].Rows[0].Delete();
ds.AcceptChanges();
В "аварийном случае 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.
После удаления строки снова свяжите свою сетку с датируемой таблицей, нет необходимости вручную сбрасывать индекс, с возможностью обработки данных он обрабатывается.
так что вам нужно перепривязать источник данных сетки.