错误:无法通过行访问已删除的行信息。

38

致相关人员,经过长时间搜索,我仍无法解决以下错误:

"已删除的行信息无法通过行访问"

我知道从datatable中删除一行后,它就无法像通常那样被访问了,这就是为什么我会收到这个错误消息。问题在于,我不确定该怎么做才能得到我想要的结果,下面我将进行说明。

基本上,当“dg1”中的一行被删除时,其下方的行将取代删除的行(显然),并因此继承了被删除行的索引。本方法的目的是通过从相应数据集的对应值中获取索引值来替换和重置取代删除行的行的索引。

现在,我只使用一个标签(lb1Text)尝试从该处理过程中获得响应,但是最后一个嵌套的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'
                }
            }
        }

非常感谢您提前的帮助,我确实进行过搜索,如果通过简单的谷歌搜索很容易弄清楚,那么请允许我一遍又一遍地自责,因为我真的尝试过了。

  • gc
4个回答

56

您还可以使用DataSet的AcceptChanges()方法来完全应用删除操作。

ds.Tables[0].Rows[0].Delete();
ds.AcceptChanges();

1
在2021年仍然相关 - MX313

39

内部if语句中数据列的当前值对于已删除的行将不可用。 要检索已删除行的值,请指定您想要原始值。 这应该可以解决您的错误:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value)

当你已经使用了.ToString(),为什么还要使用Convert.ToString?这似乎是多余的。 - Drew Chapin
@druciferre - 我同意这是多余的。我复制了原始代码并修改为使用DataRow的原始值。 - firedfly
我认为 ds.Tables[0].Acceptchanges() 将与 datagridview 的行索引对齐。 - sushil.agarwal

16

在你的“崩溃if语句”中,你可以在访问行的值之前检查该行是否已被删除:

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

此外,我不确定为什么你要将 RowState 转换成字符串再进行比较,而不是直接将其与 DataRowState.Deleted 进行比较。


0

删除行后,使用数据表重新绑定网格,无需手动重置索引,数据表会处理。

因此,您只需要重新绑定网格的数据源即可。


很抱歉我应该澄清一下,我并没有尝试更新数据源,我正在尝试使得无论数据网格中的行在哪里,数据网格始终会显示该信息在数据集中的索引。例如 - 数据网格的第2行返回索引1,但在数据集中,该行的索引为2。在不将删除提交到数据库的情况下,我需要从数据集中获取该行的索引,并将其放入数据网格中,以便dg中相应的行(具有相同信息的行)显示索引2。 - jshbrmn
也许是我对你的解释感到困惑,我还在逐渐适应C#数据库访问的逻辑。 - jshbrmn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接