DataGridView的Validating事件注册后删除操作的处理
我们在处理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.deletefor (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,ê?停ª¡ê止1Validatingif (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.deletefor (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,ê?停ª¡ê止1Validatingif (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控件中的。
DataGridView的Validating事件注册后删除操作的处理相关推荐
- 删除python的注册表_Python操作注册表详细步骤介绍
Python操作注册表步骤之1.打开注册表 对注册表进行操作前,必须打开注册表.在Python中,可以使用以下两个函数:RegOpenKey和RegOpenKeyEx.其函数原型分别如下所示. Reg ...
- 更新操作先删除缓存后更新DB,还是先更新DB后删除缓存问题???
以前自己在学校学习redis的时候还真没想到这么多,上班后看公司的项目代码,发现都是先更新DB,然后删除缓存,而且更新DB后不会立马将DB数据放入缓存,然而我以前不管是查询还是update都是操作完D ...
- Java删除操作注册表
Java删除操作注册表 示例代码如下: Preferences userData = Preferences.userRoot();Scanner input = new Scanner(System ...
- 2382. 删除操作后的最大子段和--(phase2--day3)
2382. 删除操作后的最大子段和 给你两个下标从 0 开始的整数数组 nums 和 removeQueries ,两者长度都为 n .对于第 i 个查询,nums 中位于下标 removeQueri ...
- LeetCode 2382. 删除操作后的最大子段和
LeetCode 2382. 删除操作后的最大子段和 倒叙 + 并查集 typedef long long LL; class Solution {public:vector<long long ...
- thinkphp执行删除操作然后成功success后页面跳转失败问题
初始代码 //文章栏目删除操作public function deleteArctype($id,$dataSheet){$arctype = D('arctype');$typename=$arct ...
- Datagridview代码设置选中行后,没有触发SelectionChanged事件
不知道大家有没有遇到过这个问题,在winform开发软件的过程中,使用Datagridview代码设置选中行后,没有触发SelectionChanged事件,但是通过界面点击单元格或者选中行却是可以触 ...
- 怎么注销空壳公司,注册后没有任何操作?
首先判断自己可以用哪种方法注销.可以简易注销还是只能普通注销. 是吊销了,还是异常,甚至被列为严重违法失信企业,已吊销等情况. 即使没有上述问题,但大部分企业注册后根本没报税,单单税务补报.补缴罚款. ...
- jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例
day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...
最新文章
- 生信服务器入门级基本设置
- 禁用software reporter tool.exe 解决CPU高占用率的问题
- usaco The Castle(flood fill)
- hibernate的映射之二(一对多双向关联)
- WiFi 802.11ax
- footer代码html,css如何实现footer定位(完整代码)
- vs2012 vc++控制台程序 配置成64位
- 一定要吃透的四个人性真相
- 华为拍月亮申请专利;魅族黄章回应李楠离职;GoLand 2019.2 Beta 发布 | 极客头条...
- js原生设计模式——8单例模式之简约版属性样式方法库
- 转:从内部开始 认识Oracle数据库结构组件
- HTML+css网站设计布局模板
- ps怎么缩放图层大小_PS怎么快速修改图层大小|Adobe Photoshop CS6图层大小尺寸调整--系统之家...
- 安卓项目迁移androidX(为何需要迁移,迁移遇到的问题及解决),必须迁移,早动早省事
- VS2019配置WinPcap开发
- 史上讲解最好的Docker教程,从入门到精通(建议收藏的教程)
- Linux:VNC桌面锁屏问题处理
- Final发布 文案+美工展示
- MarkdownPad 2 HTML 渲染组件出错问题
- 破解Linux系统中root密码
热门文章
- 赵云和吕布到底谁更厉害?
- 灾变来袭不用怕,华为云数据灾备解决方案为你排忧解难
- 文件多线程下载的原理与代码展示
- 特色蛋白交联目DSS双琥珀酰亚胺辛二酸酯/Sulfo-SM/CC/DSP二硫双(琥珀酰亚胺丙酸酯
- java计算机毕业设计医院管理系统源程序+mysql+系统+lw文档+远程调试
- 浪费自己的时间,就是慢性自杀;浪费别人的时间, 就是谋财害命。
- verilog实现hpm接口代码
- 链改:区块链和产业的互相救赎|筱静观察
- 选择LED光源必备的三要素
- 物以类聚,人以群分--走出软件作坊:三五个人十来条枪 如何成为开发正规军(十一)