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.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控件中的。
DataGridView的Validating事件注册后删除操作的处理的更多相关文章
- 给listview添加长时间点击事件(完成删除操作)
出现的问题是:当长时间点击listview的时候,触发长时间点击事件的同时也会触发点击事件,处理的办法是在长时间点击事件中加上return true:这样就可以很好的解决了. 给listview天机长 ...
- 将listBox中信息显示在dataGridview中,操作datagridview后删除listBox信息和SQL数据库信息 续(浅谈listBox..)
应用场景 对datagridview控件使用了解,以及操作datagridview选中的信息删除,并且有二次确认后才删除用户信息.相应的删除listbox中用户信息,下面一起看看需要哪些准备 ...
- javascript中事件对象注册与删除
事件对象 注册事件 直接给dom对象设置属性,只能给对象设置一个属性,如果设置多个事件处理函数,则最后的生效: 给html标签设置属性,(若法1和法2同时使用,则法1生效): 事件注册 绑定事件监听函 ...
- 在分页中,删除操作后,AJAX重载刷新当前页
需求 分页中,在 删除 和 编辑 完成后,AJAX重载刷新 当前页 ,而不是跳转到 第一页 实现步骤 添加两个的 input 控件,用来存储 当前页数 和 记录总条数(非必须,能有方法获取到这两个值即 ...
- thinkphp5使用前置后置操作
下面举个例子,前置删除的例子 模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的 控制器中实例化类 $cate=model('cate'); $cate-> ...
- day85:luffy:购物车根据有效期不同切换价格&购物车删除操作&价格结算&订单页面前戏
目录 1.购物车有效期切换 2.根据有效期不同切换价格 3.购物车删除操作 4.价格结算 5.订单页面-初始化 1.购物车有效期切换 1.关于有效期表结构的设计 1.course/models.py ...
- 跟我一起学extjs5(18--模块的新增、改动、删除操作)
跟我一起学extjs5(18--模块的新增.改动.删除操作) 上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...
- DataGridView ——管理员对用户的那点操作
记得第一次做机房收费系统的时候,就在加入删除用户这出现了点小问题,由于一直都是一个容不得一点瑕疵的人.所以对查询用户的时候查询一次就会多一些空行我非常是不能容忍.看似非常小的问题,我却花了非常长的时间 ...
- 17、手把手教你Extjs5(十七)模块的新增、修改、删除操作
上节在Grid展示时做了一个金额单位可以手工选择的功能,如果你要加入其他功能,也只要按照这个模式来操作就行了,比如说你想改变金额字段的颜色.小数位数.零值是否显示.货币符号.单位显示在标题栏或者跟在金 ...
随机推荐
- ajax post传值
一.字符串 $.ajax({ type: "POST", data: {"ID&quo ...
- Lucene站内搜索的设计思路
正好近期部门有一个小需求需要做商品的搜索,虽然最终由于工作量等原因先做数据库搜索,我依然用刚接触的Lucene弄了一套自嗨. 首先看需求:搜索:根据商品标题和内容搜索 没错,就这么简单! 我想了想,数 ...
- ajax 上传图片 并预览
<img {if !$article[pic]}style="display: none"{/if} width="82" height="6 ...
- JavaSE_ 反射 目录(27)
JavaSE学习总结第27天_反射 & 设计模式 & JDK5.7.8新特性27.01 反射_类的加载概述和加载时机27.02 反射_类加载器的概述和分类27.03 反射_反射概述27 ...
- hive premanent udf 发布...
起因: hive premanent udf 发布成功,但是hue 无法加载使用(但是cli 是可用的) ,处理半天,依然不可用!后来发现重启hiveserver2 就可以了 具体步骤如下: ...
- 自己动手写 ASP.NET MVC 分页 part1
学习编程也有一年半载了,从来没有自己动手写过东西,都是利用搜索软件找代码,最近偶发感慨,难道真的继续做码农??? 突发奇想是不是该自己动手写点东西,可是算法.逻辑思维都太弱了,只能copy网上的代码, ...
- python之math模块
1.math简介 >>>import math #导入math模块 >>>dir(math) #这句可查看所有函数名列表 >>>help(math ...
- EventStore的设计思路
EventStore的设计思路 最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event ...
- 怎么给没链接的flash加超链接
最近开始准备设计一个广告条,本想用阿里妈妈的的banner marker来设计,却遗憾的发现,banner marker已经实行收费模式了. 我不得不启用另一款在线banner生成工具,百度旗下的&q ...
- Struts2 学习笔记15 Struts标签 part1
来说一下Struts标签,之前我们也很多地方用到了,还是来总结一下. 首先是property标签. <li>property:<s:property value="user ...