我用DataGridView绑定到一个BindingSource上,绑定代码没问题。在界面上操作DataGridView,添加或者修改界面上的数据,数据源中的数据正常变化。但是唯独删除DataGridView中的某行,数据源得不到更新(datagridview的AllowUserToDeleteRows属性也设置为True了)。我的代码逻辑是处理datatable的RowChanged事件:我是这样想的,绑定dataset之后,对DataGridView的修改会引发DataTable内的RowChanged事件,我只需要处理这个事件就能及时更新数据源了。处理代码如下private void UpdateDateBase(object sender, DataRowChangeEventArgs e)
        {
            switch(e.Action)
            {
                case DataRowAction.Add: DataBase.Add(e.Row,InformationDataSet); break;
                case DataRowAction.Change: DataBase.Modify(e.Row,InformationDataSet); break;
                case DataRowAction.Delete: DataBase.Delete(e.Row,InformationDataSet); break;
                    
            }
在这个方法前面加断点后(断点在private前),无论是在DataGridView中修改还是增加一行,程序均在断点处停止,但是如果要是删除DataGridView中的某一行,程序没有在相同的断点处停止。这样可以推断删除操作没有正常引发RowChanged事件,但是修改或者增加的操作却都引发了,请问这是为什么?

解决方案 »

  1.   


    先谢谢你,我手动查看了数据库,在datagridview里删除一行后,数据库中的相应数据是没有变化的。至于你提到的DataKeyNames,我现在设置下看看。
      

  2.   


    这个属性貌似是WEB FORM 里的,我用的是winform。^_^!
      

  3.   

    删除的时候常会出现一种情况,你删除了该行,于是与该行有关的东西也就丢失了,如:属性,相关事件。这可能使后续有关的指令不能正常运行,所以我认为,这是引起你的问题的原因。
    再者,你要看你删除行使用的方法与DataRowAction.Delete是否匹配,这也可能导致删除的时候不能引发该事件。
    建议改换别的方法,直接使用DataAdapter的Update方法可以更新对数据库的所有更改,该方法必须设主键。当然,该方法功能也有限,在需要时还可以自己编写强功能的Update方法。
      

  4.   

    先谢谢你的回答,我的意思是界面删除DataGridView一行数据后,没有引发DataTable的RowChanged事件,从原理上来讲,既然绑定到了某个数据源上,对界面的操作就相当于对数据源的操作,也就是数据源里对应表的那一行的状态应该被自动设置为deleted。现在的情况是,修改或者增加一行正确引发了RowChanged事件,我弄不明白这是为什么?这个事件是.NET库里定义好的。而且不知道如何去调试,等待ING....
      

  5.   

    你说的还挺清楚了  新增修改走事件  删除不走  那你删除的时候想想其他办法吧  我一般都直接操作datagridview  不会操作datatable然后再绑定
      

  6.   


    感谢你的回答,事实情况确实如你所说。在DataGridView里删除一行,其实最终调用的是Remove方法,也就是这行从数据源中彻底删除,因为不是调用的Delete方法,所以也不会引发RowChanged事件,即使用Adapter的Update方法强行更新也没有用,因为行彻底被删除!