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展示时做了一个金额单位可以手工选择的功能,如果你要加入其他功能,也只要按照这个模式来操作就行了,比如说你想改变金额字段的颜色.小数位数.零值是否显示.货币符号.单位显示在标题栏或者跟在金 ...
随机推荐
- sp_makewebtask
Transact-SQL 参考 sp_makewebtask 创建一项生成 HTML 文档的任务,该文档包含执行过的查询返回的数据. 说明 所有 Web 作业在企业管理器的"作业分类& ...
- POJ 1840 Brainman(逆序对数)
题目链接:http://poj.org/problem?id=1804 题意:给定一个序列a[],每次只允许交换相邻两个数,最少要交换多少次才能把它变成非递降序列. 思路:题目就是要求逆序对数,我们知 ...
- 设计模式(十一)代理模式Proxy(结构型)
1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供 ...
- [LeetCode]题解(python):124-Binary Tree Maximum Path Sum
题目来源: https://leetcode.com/problems/binary-tree-maximum-path-sum/ 题意分析: 给定一棵树,找出一个数值最大的路径,起点可以是任意节点或 ...
- arm中的ldr指令
label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.
- 射频识别技术漫谈(21)——RC系列射频芯片的天线设计
个人感觉使用RC系列射频芯片开发卡片读写器,主要的关键点有两个,分别涉及硬件和软件.软件上的关键是如何正确设置RC系列射频芯片内部的64个寄存器,硬件上的关键则是RC系列射频芯片的天线设计.天线提供了 ...
- 软碟通UltraISO 9.65.3237官方注册版
UltraISO软碟通是一款功能强大.方便实用.老牌优秀的光盘映像文件制作/编辑/转换工具:可直接编辑ISO文件,从ISO中提取文件和目录:也可从CD – ROM制作光盘映像或者将硬盘上的文件制作成I ...
- Ext JS学习第十四天 Ext基础之 Ext.DomHelper
此文用来记录学习笔记 •我们已经学过了Element这个类,无疑是非常强大的,里面提供了丰富的方法供我们使用,但是Ext为了更加的方便我们去操作DOM元素,特提供了DomHelper这个辅助的工具 ...
- webform基础介绍及页面传值(session,cookie)、跳转页面
一,IIS 1.首先知道IIS是个什么东西:它是web服务器软件,安装在服务器上,接受客户端发来的请求,并传送给服务器端,然后响应请求并送回给客户端.类似于饭店里的服务员. 2.会安装IIS——控制面 ...
- SQL 插入语句汇总
INSERT VALUES 插入一行或多行到目标表中 -- single row INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipco ...