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

C# 错误:无法通过行访问已删除的行信息,c#,datagrid,dataset,runtime,C#,Datagrid,Dataset,Runtime,对于这些人来说,我花了相当长的时间来寻找一条走出这个错误的途径 “无法通过行访问已删除的行信息” 我知道,一旦从数据表中删除了一行,就无法以典型的方式访问它,这就是为什么我会出现此错误。最大的问题是,我不知道该怎么做才能得到我想要的结果,我将在下面概述 基本上,当“dg1”中的一行被删除时,它下面的行将取代删除的行(显然),从而继承删除的行索引。此方法的目的是替换和重置取代已删除行的行索引(通过从数据集中的相应值中获取它)以及索引值 现在我只是使用一个标签(lblText)来尝试从进程获取响应,

对于这些人来说,我花了相当长的时间来寻找一条走出这个错误的途径

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

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

基本上,当“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'
                }
            }
        }
void dg1_单击(对象发送方,事件参数e)
{
rowIndex=dg1.CurrentRow.Index;//获取当前行
字符串值=Convert.ToString(dg1.Rows[rowIndex].Cells[0].value);
if(ds.Tables[0].Rows[rowIndex].RowState.ToString()=“已删除”)
{
对于(int i=0;i
提前感谢你的帮助,我真的做了搜索,如果通过一个简单的谷歌搜索很容易找到答案,那么让我自己重复地恨我,因为我确实尝试过

  • gc

删除行后,使用datatable重新绑定网格,无需手动重置索引,datatable会处理它


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

内部if语句中数据列的当前值将不适用于已删除的行。若要检索已删除行的值,请指定需要原始值。这将修复您的错误:

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value)
在“崩溃如果”中,您可以在访问该行的值之前检查该行是否已被删除:

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

另外,我不知道为什么要将行状态字符串化(),而不是将其与DataRowState.Deleted进行比较。

还可以使用数据集的AcceptChanges()方法完全应用删除

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

很抱歉,我应该澄清一下,我根本没有试图更新数据源,我是在尝试这样做,无论数据网格中行的位置如何,数据网格都将始终显示该信息在数据集中的索引。例如,数据网格的第2行返回一个索引1,但在数据集中,该行的索引w是2。在不向数据库提交删除的情况下,我需要从数据集中获取该行的索引,并将其放入datagrid中,以便dg中的对应行(具有相同信息的行)显示索引为2。也许我被你的解释弄糊涂了,我仍然习惯于c#数据库访问的逻辑。当你已经使用
.ToString()时,为什么还要使用
Convert.ToString
?这似乎是多余的。@druciferre-我同意它是多余的。我复制了OP的原始代码,并将其修改为使用DataRow的原始值。我认为ds.Tables[0].Acceptchanges()将与datagridview的行索引对齐