窗体1设计:
主窗体上有一个DATAGRIDVIEW控件和一个BUTTON按钮控件
代码:
namespace WindowsApplication2
{
    public partial class Form1 : Form
    {
        private SqlDataAdapter ad;
        private DataSet ds;        public Form1()
        {
            InitializeComponent();
        }        private void Form1_Load(object sender, EventArgs e)
        {
            ad = new SqlDataAdapter("select * from PayType",DB.conn);
            ds = new DataSet();
            ad.Fill(ds, "PayType");
            this.dgvTest.DataSource = ds.Tables["PayType"];
        }        private void btnUpdate_Click(object sender, EventArgs e)
        {
            SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(ad);
            ad.Update(ds,"PayType");
        }
    }
}
当点击了修改按钮时,会将修改后的数据保存回数据库中
窗体2设计:
主窗体中有一个DATAGRIDVIEW控件,DATAGRIDVIEW控件中新增加了一列为更新按钮,其他和上面的DATAGRIDVIEW没区别
然后我添加了2个事件,dgvMaintenance_CellEndEdit和dgvMaintenance_CellMouseClick。
dgvMaintenance_CellEndEdit事件中记录更新的行(rowIndex)
dgvMaintenance_CellMouseClick事件判断,如果点击了该行的更新按钮就将数据保存回数据库,当然BUG还是有的,但这个不是关键问题,我的问题是:
该程序运行后,当我修改了其中一单元格的数据后,一定要点击其他行(不能点击本行)数据才能保存回数据库;或者是修改单元格数据后(不包括最后一行)按回车,这样在去点更新按钮,数据也能保存回数据库,但修改数据后,直接点击更新按钮,就无法保存数据。
这个问题困扰了我许久,一直想不明白,望遇到过此类问题的高手指点迷津。
小生将万分感谢。

解决方案 »

  1.   

    我在CellEndEdit,CellLeave,CellMouseLeave中添加了DataGridView控件的EndEdit()方法后,修改某行数据回车后在点更新能成功,但是修改完后直接点本行的更新按钮还是失败,我在CellMouseClick事件中让程序输出dgvMaintenance.IsCurrentRowDirty显示更新操作后是否提交,
    代码如下:
    private void dgvMaintenance_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                Console.WriteLine(dgvMaintenance.IsCurrentRowDirty);
                int columnIndex = e.ColumnIndex;
                if (columnIndex == 0 && e.RowIndex == rowIndex)
                {
                    rowIndex = -1;
                    sqlCmdBuilder = new SqlCommandBuilder(adapter);
                    adapter.Update(DB.ds, scrTable);
                }
                
            }        private void dgvMaintenance_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                rowIndex = e.RowIndex;
            }        private void dgvMaintenance_CellLeave(object sender, DataGridViewCellEventArgs e)
            {
                this.dgvMaintenance.EndEdit();
            }        private void dgvMaintenance_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
            {
                this.dgvMaintenance.EndEdit();
            }
    例如我修改了第一行的某个数据后,直接去点同一行的任何一列,IsCurrentRowDirty都为true,表示该修改操作未提交。
      

  2.   

    this.validate();
    //and then update ...