博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DataGridView的Validating事件注册后删除操作的处理
阅读量:5164 次
发布时间:2019-06-13

本文共 4316 字,大约阅读时间需要 14 分钟。

我们在处理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数ºy是º?否¤?超?出?集¡¥合?                        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+"是º?否¤?删¦?除y第̨²¬?项?,ê?必À?须?填¬?写¡ä内¨²容¨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断?是º?否¤?删¦?除y按ã¡ä钮£¤获?取¨?焦1点Ì?,ê?并¡é且¨°当Ì¡À时º¡À删¦?除y的Ì?时º¡À Validating有®D错䨪误¨®的Ì?行D,ê?            //即¡äCurrentCell为a当Ì¡À前¡ã选?中D,ê?停ª¡ê止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数ºy是º?否¤?超?出?集¡¥合?                        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+"'是º?必À?填¬?项?,ê?必À?须?填¬?写¡ä内¨²容¨Y。¡ê");                                e.Cancel = true;                            }                        }                    }                }                           }        }

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

 

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

 

protected override void OnLostFocus(EventArgs e)        {            base.OnLostFocus(e);            //判D断?是º?否¤?删¦?除y按ã¡ä钮£¤获?取¨?焦1点Ì?,ê?并¡é且¨°当Ì¡À时º¡À删¦?除y的Ì?时º¡À Validating有®D错䨪误¨®的Ì?行D,ê?            //即¡äCurrentCell为a当Ì¡À前¡ã选?中D,ê?停ª¡ê止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控件中的。

 

转载于:https://www.cnblogs.com/suncoolcat/p/3323014.html

你可能感兴趣的文章
hdu 1559(最大子矩阵)
查看>>
hdu 1533(最小费用最大流)
查看>>
2. RDD编程
查看>>
centos7.x使用yum指令安装mysql
查看>>
C#与Java的比较
查看>>
存储器管理
查看>>
javascript如何获取复选框中的值?
查看>>
@Transacitonal注解不生效之spring中expose-proxy的作用与原理
查看>>
20170914课后作业-阅读任务-阅读笔记
查看>>
KnockoutJs学习笔记(六)
查看>>
【C语言】1218 THE DRUNK JAILER
查看>>
memcached 命令行举例
查看>>
jquery.trigger触发事件和鼠标引发事件的不同
查看>>
3.5 静态文件
查看>>
Position属性四个值:static、fixed、absolute和relative的区别和用法
查看>>
MySQL教程 3.3
查看>>
linux内核空间与用户空间
查看>>
DirectX介绍(转)
查看>>
removeCss
查看>>
职场规则和潜规则——太极政道之现象
查看>>