cellEndEdit事件中的代码如下:
try
            {
                ocnn = new OleDbConnection(connections);
                ocnn.Open();                for (int i = 0; i < dgv_InInfo.Rows.Count - 1; i++)
                {
                    for (int j = 0; j < dgv_InInfo.Rows.Count - 1; j++)
                    {                        string value1 = Convert.ToString(dgv_InInfo.Rows[i].Cells[2].Value);
                        string value2 = Convert.ToString(dgv_InInfo.Rows[j].Cells[2].Value);
                        if (i != j && value1 == value2)
                        {
                            MessageBox.Show("此货物已当前列表中!", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            dgv_InInfo.Rows.Remove(dgv_InInfo.Rows[j]);
                            return;
                        }
                        else
                        {
                            string sql = "select * from MIS_MaterielRegiser where MR_Name='" + value1 + "'";                            ocmd = new OleDbCommand(sql, ocnn);
                            OleDbDataReader reader = ocmd.ExecuteReader();
                            reader.Read();
                            dgv_InInfo.Rows[i].Cells[1].Value = reader["MR_Number"].ToString();
                            dgv_InInfo.Rows[i].Cells[3].Value = reader["MR_Model"].ToString();
                            dgv_InInfo.Rows[i].Cells[4].Value = reader["MR_Unit"].ToString();
                        }
                    }
                }
                ocnn.Close();
            }
            catch (Exception)
            {
                MessageBox.Show("请从'货料名称'中选择一项!");
            } value1所在的列为下拉列,当我从下拉列选一个值后,有时候会出现一个异常情况,那就是这个单元格没有取到在下拉列表选定的值,从而导致如题如述的问题,报出异常MessageBox.Show("请从'货料名称'中选择一项!");后自动增加2个空行,找问题我已经找了整整几个小时了。求解答!

解决方案 »

  1.   

    如果内容尚未提交,用dgv_InInfo.Rows[i].Cells[1].EditedFormattedValue试试,可以通过判断DataGridView1.IsCurrentCellDirty 的属性得知是否内容已经提交
      

  2.   

    设置dataGridView1.AllowUserToAddRows = false试试
      

  3.   

    gv_InInfo.Rows[i].Cells[2].EditedFormattedValue是没有效果的,至于DataGridView1.IsCurrentCellDirty也试过了,还是一样,会出现空行
    if (dgv_InInfo.IsCurrentRowDirty == true)
                    {
                        for (int i = 0; i < dgv_InInfo.Rows.Count - 1; i++)
                        {
                            for (int j = 0; j < dgv_InInfo.Rows.Count - 1; j++)
                            {                            string value1 = Convert.ToString(dgv_InInfo.Rows[i].Cells[2].EditedFormattedValue);
                                string value2 = Convert.ToString(dgv_InInfo.Rows[j].Cells[2].EditedFormattedValue);
                                if (i != j && value1 == value2)
                                {
                                    MessageBox.Show("此货物已当前列表中!", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    dgv_InInfo.Rows.Remove(dgv_InInfo.Rows[j]);
                                    return;
                                }
                                else
                                {
                                    string sql = "select * from MIS_MaterielRegiser where MR_Name='" + value1 + "'";                                ocmd = new OleDbCommand(sql, ocnn);
                                    OleDbDataReader reader = ocmd.ExecuteReader();
                                    reader.Read();
                                    dgv_InInfo.Rows[i].Cells[1].Value = reader["MR_Number"].ToString();
                                    dgv_InInfo.Rows[i].Cells[3].Value = reader["MR_Model"].ToString();
                                    dgv_InInfo.Rows[i].Cells[4].Value = reader["MR_Unit"].ToString();
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("不允许有空值!");
                    }
      

  4.   

    这个问题吧 我觉得是SQL上错误了,你的异常是没提取到下拉列表的值```但是SQL却已经产生了 数据库也执行了没有WHERE的查询 程序没停 又接着个Gridview 复制这时候读回来的数据源是空值 所以就产生空行````你抛出的异常始终是 
     catch (Exception)
                {
                    MessageBox.Show("请从'货料名称'中选择一项!");
                }
    所以提示你的是这个异常`````
    嗯你打个断电看看出异常的时候完整的执行SQL到底是什么?
      

  5.   

    其实问题更早出现是在string value1 = Convert.ToString(dgv_InInfo.Rows[i].Cells[2].Value)因为dgv_InInfo.Rows[i].Cells[2].Value这个单元格的值是空的,所以后面的sql语句是没有执行的。从这里就直接跳到异常了!
      

  6.   

    加个判断吧```先判断一次 value1是否为空 在进行后续操作?或者你发我邮箱我帮你看看吧
      

  7.   

    先问个问题,datagridview的单元格的默认值是""呢还是null?
      

  8.   

    刚刚好像发现了问题的真正所在。新增行跟这里的代码没关系。在cellLeave事件中有如下代码ocnn = new OleDbConnection(connections);
                    ocnn.Open();
                    string maxNum = "select max(InSingle_Number) from MIS_InsertSingle";
                    OleDbCommand max = new OleDbCommand(maxNum, ocnn);
                    OleDbDataReader dr = max.ExecuteReader();
                    dr.Read();
                    int g = dr.GetInt32(0);
                    this.dgv_InInfo.CurrentRow.Cells[0].Value = g + 1;
                    ocnn.Close();这里从数据库中取一个最大值+1后赋给当前前。当前面报异常后跳到这里发现int g = dr.GetInt32(0);
                    this.dgv_InInfo.CurrentRow.Cells[0].Value = g + 1这2句话是会运行2次的,可能这2次才是增加2个空行的关键!