我们在处理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事件注册后删除操作的处理相关推荐

  1. 删除python的注册表_Python操作注册表详细步骤介绍

    Python操作注册表步骤之1.打开注册表 对注册表进行操作前,必须打开注册表.在Python中,可以使用以下两个函数:RegOpenKey和RegOpenKeyEx.其函数原型分别如下所示. Reg ...

  2. 更新操作先删除缓存后更新DB,还是先更新DB后删除缓存问题???

    以前自己在学校学习redis的时候还真没想到这么多,上班后看公司的项目代码,发现都是先更新DB,然后删除缓存,而且更新DB后不会立马将DB数据放入缓存,然而我以前不管是查询还是update都是操作完D ...

  3. Java删除操作注册表

    Java删除操作注册表 示例代码如下: Preferences userData = Preferences.userRoot();Scanner input = new Scanner(System ...

  4. 2382. 删除操作后的最大子段和--(phase2--day3)

    2382. 删除操作后的最大子段和 给你两个下标从 0 开始的整数数组 nums 和 removeQueries ,两者长度都为 n .对于第 i 个查询,nums 中位于下标 removeQueri ...

  5. LeetCode 2382. 删除操作后的最大子段和

    LeetCode 2382. 删除操作后的最大子段和 倒叙 + 并查集 typedef long long LL; class Solution {public:vector<long long ...

  6. thinkphp执行删除操作然后成功success后页面跳转失败问题

    初始代码 //文章栏目删除操作public function deleteArctype($id,$dataSheet){$arctype = D('arctype');$typename=$arct ...

  7. Datagridview代码设置选中行后,没有触发SelectionChanged事件

    不知道大家有没有遇到过这个问题,在winform开发软件的过程中,使用Datagridview代码设置选中行后,没有触发SelectionChanged事件,但是通过界面点击单元格或者选中行却是可以触 ...

  8. 怎么注销空壳公司,注册后没有任何操作?

    首先判断自己可以用哪种方法注销.可以简易注销还是只能普通注销. 是吊销了,还是异常,甚至被列为严重违法失信企业,已吊销等情况. 即使没有上述问题,但大部分企业注册后根本没报税,单单税务补报.补缴罚款. ...

  9. jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例

    day03 - jQuery 学习目标: 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery ...

最新文章

  1. 生信服务器入门级基本设置
  2. 禁用software reporter tool.exe 解决CPU高占用率的问题
  3. usaco The Castle(flood fill)
  4. hibernate的映射之二(一对多双向关联)
  5. WiFi 802.11ax
  6. footer代码html,css如何实现footer定位(完整代码)
  7. vs2012 vc++控制台程序 配置成64位
  8. 一定要吃透的四个人性真相
  9. 华为拍月亮申请专利;魅族黄章回应李楠离职;GoLand 2019.2 Beta 发布 | 极客头条...
  10. js原生设计模式——8单例模式之简约版属性样式方法库
  11. 转:从内部开始 认识Oracle数据库结构组件
  12. HTML+css网站设计布局模板
  13. ps怎么缩放图层大小_PS怎么快速修改图层大小|Adobe Photoshop CS6图层大小尺寸调整--系统之家...
  14. 安卓项目迁移androidX(为何需要迁移,迁移遇到的问题及解决),必须迁移,早动早省事
  15. VS2019配置WinPcap开发
  16. 史上讲解最好的Docker教程,从入门到精通(建议收藏的教程)
  17. Linux:VNC桌面锁屏问题处理
  18. Final发布 文案+美工展示
  19. MarkdownPad 2 HTML 渲染组件出错问题
  20. 破解Linux系统中root密码

热门文章

  1. 赵云和吕布到底谁更厉害?
  2. 灾变来袭不用怕,华为云数据灾备解决方案为你排忧解难
  3. 文件多线程下载的原理与代码展示
  4. 特色蛋白交联目DSS双琥珀酰亚胺辛二酸酯/Sulfo-SM/CC/DSP二硫双(琥珀酰亚胺丙酸酯
  5. java计算机毕业设计医院管理系统源程序+mysql+系统+lw文档+远程调试
  6. 浪费自己的时间,就是慢性自杀;浪费别人的时间, 就是谋财害命。
  7. verilog实现hpm接口代码
  8. 链改:区块链和产业的互相救赎|筱静观察
  9. 选择LED光源必备的三要素
  10. 物以类聚,人以群分--走出软件作坊:三五个人十来条枪 如何成为开发正规军(十一)