加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

DataGridView的Validating事件注册后删除操作的处理

发布时间:2020-12-14 03:59:46 所属栏目:大数据 来源:网络整理
导读:我们在处理DataGridView必填项判断时,一般使用DataGridView的RowValidating事件判断,具体代码如下: protected override void OnRowValidating(DataGridViewCellCancelEventArgs e) { base.OnRowValidating(e); if (NecessaryColIndexArray != null) { for

我们在处理DataGridView必填项判断时,一般使用DataGridView的RowValidating事件判断,具体代码如下:

protected override void OnRowValidating(DataGridViewCellCancelEventArgs e)
        {
            base.OnRowValidating(e);
            if (NecessaryColIndexArray != null)
            {
                for (int i = 0; i < Rows.Count; i++)
                {
                    if (Rows[i].IsNewRow)
                        continue;
                    //this.delete
                    for (int m = 0; m < NecessaryColIndexArray.Length; m++)
                    {
                        //判D断?行D数oy是o?否¤?超?出?集?¥合?
                        if (NecessaryColIndexArray[m] >= 0 && NecessaryColIndexArray[m] < Columns.Count - 1)
                        {
                            if (Rows[i].Cells[NecessaryColIndexArray[m]].Value==null
                                ||
                                string.IsNullOrEmpty(Rows[i].Cells[NecessaryColIndexArray[m]].Value.ToString()))
                            {
                                MessageTools.ShowMsg("列¢D"+Columns[NecessaryColIndexArray[m]].HeaderText+"是o?否¤?删|?除y第ì¨2
??项?,ê?必à?须?填??写??内¨2容¨Y。?ê");
                                e.Cancel = true;
                            }
                        }
                    }
                }
               
            }
        } 
其中:NecessaryColIndexArray为Int[]型属性,卸载自定义DataGridView控件中。
表示必填项列的索引。
这样我们就可以实现必填项判断了。


但是这里还有一个问题:
当我们处理删除事件时,尤其是我们删除必填项没有填写完全的行的问题时。

这个Validating会一直触发。而无法完成目标。这是因为我们点击删除按钮时,

DataGridview失去焦点而删除按钮获得焦点,这样会引发Validating事件。
所以解决方法如下:
在datagridView中添加一个判断条件bool isDeleting = false;
并且将本datagridView的删除按钮作为一个属性添加到我们的自定义datagridView控件中。
这样我们在datagridview控件的LostFocus事件中可以判断是否删除按钮获得了焦点,

如果是删除按钮获得焦点,那么就我进行validating判断语句执行。

	bool isDeleting = false;
        protected override void OnLostFocus(EventArgs e)
        {
            base.OnLostFocus(e);
            //判D断?是o?否¤?删|?除y按???钮£¤获?取¨?焦1点ì?,ê?并?é且¨°当ì?à时o?à删|?除y的ì?时o?à Validating有?D错?¨a误¨?的ì?行D,ê?
            //即??CurrentCell为a当ì?à前??选?中D,ê?停a?ê止1Validating
            if (btnDel != null)
                isDeleting = btnDel.Focused;
        }


	protected override void OnRowValidating(DataGridViewCellCancelEventArgs e)
        {
            base.OnRowValidating(e);
            if (NecessaryColIndexArray != null&&!isDeleting)
            {
                for (int i = 0; i < Rows.Count; i++)
                {
                    if (Rows[i].IsNewRow)
                        continue;
                    //this.delete
                    for (int m = 0; m < NecessaryColIndexArray.Length; m++)
                    {
                        //判D断?行D数oy是o?否¤?超?出?集?¥合?
                        if (NecessaryColIndexArray[m] >= 0 && NecessaryColIndexArray[m] < Columns.Count - 1)
                        {
                            if (Rows[i].Cells[NecessaryColIndexArray[m]].Value==null
                                ||
                                string.IsNullOrEmpty(Rows[i].Cells[NecessaryColIndexArray[m]].Value.ToString()))
                            {
                                MessageTools.ShowMsg("列¢D:'"+Columns[NecessaryColIndexArray[m]].HeaderText+"'是o?必à?填??项?,ê?必à?须?填??写??内¨2容¨Y。?ê");
                                e.Cancel = true;
                            }
                        }
                    }
                }
               
            }
        }

这么做基本满足要求。但是有一个BUG就是我选择删除按钮,但是不单击它,就会忽略validating事件。结果方法如下:

转移到 删除按钮时 在按钮tag上加判断。1为完成Click

protected override void OnLostFocus(EventArgs e)
        {
            base.OnLostFocus(e);
            //判D断?是o?否¤?删|?除y按???钮£¤获?取¨?焦1点ì?,ê?并?é且¨°当ì?à时o?à删|?除y的ì?时o?à Validating有?D错?¨a误¨?的ì?行D,ê?
            //即??CurrentCell为a当ì?à前??选?中D,ê?停a?ê止1Validating
            if (btnDel != null)
            {
                isDeleting = btnDel.Focused;
                btnDel.Tag = 0;
            }
        }

点击事件
void btnDel_Click(object sender,EventArgs e)
        {
            btnDel.Tag = 1;
            btnDelClick();
        }

删除按钮的lostfocus事件中判断

if (btnDel.Tag.ToString() != "1"&&isDeleting)
            {
                isDeleting = false;
                OnRowValidating(new DataGridViewCellCancelEventArgs(0,CurrentCell.RowIndex));
            }
这样就可以比较完美的解决此问题。但是这么解决不是从本质上解决这个问题虽然目前还没有发现什么BUG,

但是不知道是否有BUG,而且适用性也不是很广。需要设置的也很多,

删除按钮必须关联到datagridView,而且删除事件也是卸载datagridView控件中的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读