背景描述:WPF项目引入WinForm中的DataGridView控件,该控件共有5列(LCM码、B/L码、Cell码、ZBD、时间),前3列每个单元格输入的数据都要验证,例如Cell码列,要验证其长度(动态验证标准)、字符含义(动态验证标准),ZBD列值自动输入,其值为Cell码列同行单元格内输入数据的某段字符,时间列为单元格获取焦点时的系统时间。
问题描述:实现了数据验证及时间列自动输入,但是ZBD列自动输入为实现,其实现代码如下,在调试时,发现Cell码列值输入结束通过验证后ZBD列单元格获取焦点后Cell码列刚输入的值没有了,且提示“索引超出范围”,还请各位提供解决方法啊
private void dgPrint_CellEnter(object sender, DataGridViewCellEventArgs e)
         {
              if (e.ColumnIndex == 3)
            {
                string jz;
                if (cmbJzCode.SelectedIndex != -1)
                {
                    jz = cmbJzCode.Text;
                    int rowIndex = e.RowIndex;
                    conn.Open();
                    string sql = "select ZBDFr,ZBDSt,ZBDLen from table_Jz where code='" + jz + "'";
                    SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    conn.Close();
                    string ZBDFr = dt.Rows[0][0].ToString();
                    string ZBDSt = dt.Rows[0][1].ToString();
                    string ZBDLen = dt.Rows[0][2].ToString();
                    if (ZBDFr == "Cell码")
                    {
                        if (dgPrint[rowIndex, 2] != null)
                        {
                            dgPrint.CurrentCell.Value = dgPrint[rowIndex, 2].Value.ToString().Trim().Substring(Convert.ToInt16(ZBDSt) - 1, Convert.ToInt16(ZBDLen));
                        }
                        else System.Windows.MessageBox.Show("Cell码为空,请先输入!", "状态提示");
                    }
                }
                else
                    System.Windows.MessageBox.Show("请先选择Jz信息!", "状态提示");
            }
        }

解决方案 »

  1.   

    问题应该出在dgPrint.CurrentCell.Value这句后面的代码,里面有很多访问下标的,仔细核对一下是否超出了范围,包括 Substring
      

  2.   


    调试过了,是dgPrint[rowIndex, 2]超出范围,但是这个指的是当前单元格的前一个单元格,我是在这个单元格输入数据并验证通过后,选择的当前单元格,按理说不应该超出范围的,不知道怎么回事,还请指教
      

  3.   

    问题已经通过其他方式解决了~~达到了一样的效果,应该还是CellValidating和CellEnter之间有冲突吧有没有人知道如何进行数据在保存到数据库时唯一性约束的异常处理啊