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

时间:2010-12-01 06:36:36

标签: c# datagrid dataset runtime

对于这可能涉及的人,我已经搜索了相当多的时间,以便摆脱这个错误

  

“无法通过行”

访问已删除的行信息

据我所知,一旦从数据表中删除了一行,无法以典型的方式访问它,这就是我收到此错误的原因。最大的问题是我不知道该怎样做才能得到我想要的结果,我将在下面概述。

基本上当删除“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

4 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:35)

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

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

答案 2 :(得分:13)

在“崩溃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进行比较。

答案 3 :(得分:0)

删除行后,使用数据表重新绑定网格,无需手动重置索引,数据表可以对其进行操作。

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