这是我的代码,我想实现在datagridview编辑数据时能自动保存新增和已修改的数据到数据库,我用的是CurrentCellChanged事件。但这个代码一启动就报错!说是this.dataGridView1.CurrentRow为NULL,于是我在绑定数据前取消事件绑定,但还是不起作用!!!有没有什么好的办法? public partial class CPModel : Form
    {
        private DataSet myDS;
        private OleDbConnection conn=null;
        private OleDbDataAdapter da = null;        private void binddata()
        {
            conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=F:/CPDB.mdb");
            conn.Open();
            string sql = "select * from OriginData";
            da = new OleDbDataAdapter(sql, conn);
            myDS = new DataSet();
            da.Fill(myDS,"OD");
            this.dataGridView1.CurrentCellChanged -= new EventHandler(dataGridView1_CurrentCellChanged);
            this.dataGridView1.DataSource = myDS.Tables["OD"].DefaultView;
            this.dataGridView1.CurrentCellChanged += new EventHandler(dataGridView1_CurrentCellChanged);
            this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
           this.dataGridView1.RowHeadersVisible = false;
        }
        public CPModel()
        {
            InitializeComponent();
            binddata();
           
        }       private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
        {
            if (this.dataGridView1.CurrentRow.IsNewRow)
            {
                da.InsertCommand = conn.CreateCommand();
                da.InsertCommand.CommandText = "insert into OriginData values(@Phases,@SpCode)";
                da.InsertCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                da.InsertCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
                int count = da.Update(myDS, "OD");
                bool result = count > 0 ? true : false;
            }
            else
            {
               OleDbParameter sp = new OleDbParameter();
                da.UpdateCommand = conn.CreateCommand();
                da.UpdateCommand.CommandText = "update OriginData set Phases=@Phases,SpCode=@SpCode where Phases=@oldid";
                da.UpdateCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                da.UpdateCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
                sp = da.UpdateCommand.Parameters.Add("@oldid", OleDbType.VarChar, 10, "Phases");
                sp.SourceVersion = DataRowVersion.Original;
                int count = da.Update(myDS, "OD");
                bool result = count > 0 ? true : false;
            }
        }
    }
}

解决方案 »

  1.   

    不管怎样,你都要对dataGridView1.CurrentRow做一个是否为null的判断,以免出错
      

  2.   

    太感谢你了,加了这句还真的可以了啊!自动更新保存这个效果还真不错,
    if (this.dataGridView1.CurrentRow == null)
             return;
      

  3.   


    this.dataGridView1.CurrentCellChanged += new EventHandler(dataGridView1_CurrentCellChanged);你把上面这句去掉,然后看看还有没有异常,如果有异常,证明之后绑定过程重新注册了事件,如果没有,则可能就是绑定后注册事件后,什么地方又触发了此事件。
      

  4.   

    确实啊,我用CellEndEdit事件已经完美解决我的要求了!