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