private bool storetods() //store the data to dataset
        {
            DataTable dt = ds.Tables["AirSampleSyncData"];            try
            {
                foreach (DataRow d in dt.Rows) //finalmax是次序.在这里可以当成是固定值.
                {
                    if (d["dataSerialId"].ToString() == finalmax.ToString())
                    {
                        d.Delete();
                        d.AcceptChanges();
                    }
                }
                //datatype是包含TextBox控件名称的数组.
                //FindTextBox(object o,String tbName)  o是容器的引用,tbName是所要获取引用的TextBox的名称.
                foreach (String tbName in datatype)
                {                    
                    TextBox tb = FindTextBox(dataInput,tbName);                   
                   
                    if (tb.Text != "") //如果TextBox内容为空则不插入数据到DataSet的表AirSampleSyncData中.
                    {
                        DataRow dr = dt.NewRow();
                        dr["dataType"] = tbName;
                        dr["dataValue"] = tb.Text;
                        dr["dataSerialId"] = finalmax.ToString();
                        dr["taskId"] = parent.GetTaskId();
                        dt.Rows.Add(dr);    
                    }  
                    
                }        
                dt.AcceptChanges();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());               
                return false;
            }
            finally
            {
                ;
            }            return true;
        }问题是这样的.当第一次调用的时候,因为表dt中没有符合finalmax的内容.所以下面部分中的删除操作就不会执行.代码运行没有问题,if (d["dataSerialId"].ToString() == finalmax.ToString())
                    {
                        d.Delete();
                        d.AcceptChanges();
                    }下面的这部分也将数据插入DataSet的表中的操作也没有问题foreach (String tbName in datatype)
                {                    
                    TextBox tb = FindTextBox(dataInput,tbName);                   
                   
                    if (tb.Text != "") //如果TextBox内容为空则不插入数据到DataSet的表AirSampleSyncData中.
                    {
                        DataRow dr = dt.NewRow();
                        dr["dataType"] = tbName;
                        dr["dataValue"] = tb.Text;
                        dr["dataSerialId"] = finalmax.ToString();
                        dr["taskId"] = parent.GetTaskId();
                        dt.Rows.Add(dr);    
                    }  
                    
                } 
 dt.AcceptChanges();
       但当第二次再运行这个函数的时候,因为Dataset中的AirSampleSyncData中已经存在符合finalmax的行.这样就会执行删除操作.当是一执行就是会报错.我也不知道是在执行删除的时候发出的错还是在插入新的数据的时候出了错.显示InvalidOperationException. 
我不知道什么原因.高手帮忙一下.

解决方案 »

  1.   

    试着将d.AcceptChanges();修改为dt.AcceptChanges();看一下
      

  2.   

    2楼说的没错,最好使用DataTable的AcceptChanges
    另外判断一个字符串是否为空,最好使用string.isnullorempty();
      

  3.   

    if (d["dataSerialId"].ToString() == finalmax.ToString())
                        {
                            d.Delete();
                        }
    dt.AcceptChanges();// 会把RowState为deleted的删除掉
      

  4.   

    foreach (DataRow d in dt.Rows) //finalmax是次序.在这里可以当成是固定值.
                    {
                        if (d["dataSerialId"].ToString() == finalmax.ToString())
                        {
                            d.Delete();
                         //   d.AcceptChanges();去掉这行
                        }
                    }
    dt.AcceptChanges();//你在下面的程式中已经写了
      

  5.   

    我把d.AcceptChanges()改成dt.AcceptChanges()还是不行.
      

  6.   

    4楼正解. 但是我还是不知道为什么会出现这样的错误.dt.AcceptChanges()在这里起什么作用?执行了这行后DataSet中表会有什么样的变化呢..在执行过delete后.相应的行的RowState就是被标记为Deleted. 是不是实际这一行没有删除?我不是很清楚.大家说一下这其中的道理.谢谢
      

  7.   

    d.AcceptChanges()如果有这一行那么datarow就接收了先前的delete操作.也就是那个foreache中的datarow发生了变化.再去循环是,就会出现异常.找不到被删除的那一行了.
    等到最后循环完毕后再执行dt.AcceptChanges()让datatable接收先前对datatable的操作,就可以了.