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

Posted

技术标签:

【中文标题】错误:无法通过行访问已删除的行信息【英文标题】:Error: Deleted row information cannot be accessed through the row 【发布时间】:2011-05-18 08:03:12 【问题描述】:

这可能与谁有关,我已经搜索了相当长的时间,以找出解决此错误的方法

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

我了解,一旦从数据表中删除了一行,就无法以典型的方式访问它,这就是我收到此错误的原因。最大的问题是我不确定如何获得我想要的结果,我将在下面概述。

基本上,当“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'
                
            
        

提前感谢您的帮助,我确实进行了搜索,如果通过简单的谷歌搜索很容易弄清楚,那么请允许自己反复讨厌我,因为我确实尝试过。

gc

【问题讨论】:

【参考方案1】:

删除行后,用数据表重新绑定你的网格,不需要手动重置索引,数据表处理它。

所以你只需要重新绑定网格的数据源。

【讨论】:

很抱歉,我应该澄清一下,我根本没有尝试更新数据源,我试图做到这一点,无论数据网格中行的位置如何,数据网格都会始终显示该信息在数据集中的索引。即 - 数据网格的第 2 行返回 1 的索引,但在数据集中,该行的索引为 2。在不将删除提交到数据库的情况下,我需要从数据集中获取该行的索引并将其放入datagrid 因此 dg 中的相应行(具有相同信息的行)显示索引为 2。 也许我被你的解释弄糊涂了,我还在习惯c#数据库访问的逻辑。【参考方案2】:

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

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

【讨论】:

既然已经使用了.ToString(),为什么还要使用Convert.ToString?这似乎是多余的。 @druciferre - 我同意这是多余的。我复制了 OP 的原始代码并对其进行了修改以使用 DataRow 的原始值。 我认为 ds.Tables[0].Acceptchanges() 将与 datagridview 的行索引对齐【参考方案3】:

在您的“崩溃如果”中,您可以在访问它的值之前检查该行是否被删除:

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

    // blaaaaa

另外,我不知道为什么你 ToString() 是 RowState 而不是将它与 DataRowState.Deleted 进行比较。

【讨论】:

【参考方案4】:

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

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

【讨论】:

在 2021 年仍然相关

以上是关于错误:无法通过行访问已删除的行信息的主要内容,如果未能解决你的问题,请参考以下文章

C#中的DataTable怎么获取已删除行的信息

sql server无法修改数据

如何恢复 Big Query 中已删除的行?

如何解决JMeter通过JDBC 访问Oracle 和MySQL的问题

删除数据库表中空的一行时,弹出这样一个错误,帮帮忙。

删除 tableView 中的错误行