首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
DataGridView按delete键删除多行数据时的提示判断
所属栏目:winform  时间:2013-07-22 13:43  作者:狼子

如果不用DataSet和Adapter绑定数据,自己在Load事件里读取一个DataTable绑定数据到DataGridView,删除数据时就不能再利用DataSet了,需要自己取选中行的关键字段值,构建sql语句执行

这里只记录一个选择了多行后,点击键盘delete键时的判断

正常是利用UserDeletingRow和UserDeletedRow事件的,但是如果选择了多行,UserDeletingRow事件会被执行多次,这里有一个很怪的问题,我现在没时间查资料是什么原因了,先记录下来,回头再查

如果在第一次执行UserDeletingRow事件时,执行了e.Canecl = true;,这个事件会被执行的净数是:选中行总数-1

如果在第一次执行UserDeletingRow事件时,做了批量操作,进入UserDeletedRow事件后,执行了重新绑定数据的操作,UserDeletingRow事件会被中断,也就是只执行一次

这里我想不懂的是为什么执行次数和选中行的总数不相等。。。为什么是选中行总数-1?

因为要防止用户连续点击delete键,所以必须做这个判断,恢复计数器的

下面是代码,可以正常运行,用到的一些自定义方法,这里不记录了,反正就是执行sql语句的操作,没什么好记录的

private int deleteCount = 0;
        private int selectedRowCount = 0;
        private bool cancelDelete = false;
        private int eventCount = 0;
        private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            //UserDeletingRow事件,如果第一次没有取消,执行了批量操作,就只执行一次,否则会执行选中行数-1次。。。
            eventCount++;
            deleteCount++;
            //MessageBox.Show(String.Format("begin: eventCount = {3}, deleteCount = {0}, selectedRowCount = {1}, cancelDelete = {2}", deleteCount, selectedRowCount, cancelDelete, eventCount));
 
            //第一次执行UserDeletingRow事件时,提醒是否要删除数据,批量删除所有选中行
            if (deleteCount == 1)
            {
                //取总共要删除的行数,即UserDeletingRow将要执行的次数
                selectedRowCount = dataGridView1.SelectedRows.Count - 1;
                
                //提醒是否要取消操作
                cancelDelete = SaleClass.CancelDelte();
                if (cancelDelete)
                {
                    e.Cancel = true;
                }
                else
                {
                    //批量删除所有选中行,如果删除失败,取消后续所有操作
                    if (!DeleteRows())
                    {
                        cancelDelete = true;
                        e.Cancel = true;
                    }
                }
            }
 
            //MessageBox.Show(String.Format("before: deleteCount = {0}, selectedRowCount = {1}, cancelDelete = {2}", deleteCount, selectedRowCount, cancelDelete));
            //最后一次执行UserDeletingRow时,要恢复计数器,以备下一次点击delete键
            if (deleteCount == selectedRowCount)
            {
                deleteCount = 0;
                selectedRowCount = 0;
                cancelDelete = false;
            }
 
            //MessageBox.Show(String.Format("end: deleteCount = {0}, selectedRowCount = {1}, cancelDelete = {2}", deleteCount, selectedRowCount, cancelDelete));
        }
 
        private void dataGridView1_UserDeletedRow(object sender, DataGridViewRowEventArgs e)
        {
            FillList(); //重新填充数据
        }
 
 
小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17