TextBox和DataGridView控件的事件发生顺序
今天在编写代码的时候碰到了控件的验证问题。
命题:在前台的DataGridView中,任意行的单元格都不能为空,也就是说,在编写的过程中,某一行的编辑完成之后,需要验证各单元是否为空。
事件绑定:最开始编写的时候,我调用了dgvDetail.RowLeave事件。发现每次鼠标移到其他行的时候,最后一个编写的单元数据还没有写入之前就开始执行RowLeave事件了。也就是说,用户已经填写了数据,但是在数据写入控件之间就先执行验证事件了。这样的操作过程对用户来讲是非常不友好的。
然后我做了一个调整,将验证事件绑在了dgvDetail.RowValidated上。
随后我做了一个控件事件的发生顺序以及赋值情况的测试。
测试对象:TextBox、DataGridView.前台窗口如下:
后台代码如下:
public partial class TestEvent : Form {string txtEventStr = "", dgvEventStr = "";int txtI = 0, dgvI = 0;public TestEvent(){InitializeComponent();Action<string> txtAdd = txt =>{txtI++;txtEventStr += string.Format("\r\n{0}:{1}, Text = {2}", txtI, txt, txtEventTest.Text);};Action<string> dgvStrAdd = txt =>{dgvI++;dgvEventStr += string.Format("\r\n{0}:{1}, Text = {2}", dgvI, txt, dgv[0, 0].Value);};txtEventTest.Validated += (a, b) => txtAdd("Validated");txtEventTest.Validating += (a, b) => txtAdd("Validating");txtEventTest.Leave += (a, b) => txtAdd("Leave");txtEventTest.LostFocus += (a, b) => txtAdd("LostFocus");txtEventTest.GotFocus += (a, b) => txtAdd("GotFocus");txtEventTest.Enter += (a, b) => txtAdd("Enter");btnTxtEvent.Click += (a, b) => MessageBox.Show(txtEventStr);dgv.RowEnter += (a, b) => dgvStrAdd("RowEnter");dgv.RowValidated += (a, b) => dgvStrAdd("RowValidated");dgv.RowValidating += (a, b) => dgvStrAdd("RowValidating");dgv.RowLeave += (a, b) => dgvStrAdd("RowLeave");btnDGVEvent.Click += (a, b) => MessageBox.Show(dgvEventStr);} }
前台操作:
鼠标点击textbox => 输入文字 => 点击按钮btnTxtEvent。
鼠标点击dgv的[0,0]单元 => 输入文字 => 点击按钮btnDGVEvent。
执行结果:
根据最后的执行结果,我们可以清晰的看到textBox的事件执行顺序为Enter、GotFocus、LostFocus、Leave、Validating、Validated,也就是说程序先“进入”控件,然后控件“得到焦点”,紧接着控件“失去焦点”,此时前台输入的值已经写入控件属性,然后“离开”控件,开始“校验”,最后发生“校验完”事件。
而DataGridView的行事件执行顺序为RowEnter、RowLeave、RowValidating、RowValidated,顺序与textBox的事件执行顺序可以说一致,但有一个很大的区别,前台输入值写入控件的时间。相较于textbox在Leave事件之前就写入,DataGridView却是在RowLeave事件之后才写入控件的属性。因此,回到最开始的命题中,才会导致那样不友好的操作结果。
以上内容为笔者亲著,转发请注明本文地址:
http://www.cnblogs.com/icyJ/archive/2012/10/29/Event_Order.html
转载于:https://www.cnblogs.com/icyJ/archive/2012/10/29/Event_Order.html
TextBox和DataGridView控件的事件发生顺序相关推荐
- 深入了解DataGridView控件
DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需 ...
- DataGridView控件使用大全
原文地址为: DataGridView控件使用大全 DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid ...
- C# DataGridView控件用法
方法一: int index = this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[1].Value = &quo ...
- Winform DataGridView控件添加行号
有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: 1 e.Row.Hea ...
- (转)使用DataGridView控件常见问题解答
1. 如何使指定的单元格不可编辑? ReadOnly属性决定了单元格中的数据是否可以编辑,可以设置单元格的ReadOnly 属性,也可以设置DataGridViewRow.ReadOnly 或D ...
- html asp textbox,ASP.NET中 TextBox 文本输入框控件的使用方法
TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属性 说明 AutoPostBack 获 ...
- C#中DataGridView控件使用大全
c datagridview 分类: C/C++/C# DataGridView 动态添加新行: DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自 ...
- 转——C# DataGridView控件 动态添加新行
DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...
- C# DataGridView控件动态添加行与列
DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...
最新文章
- 【国内首家】第一个基于语音生成实时知识图谱的系统来啦!!!
- 创建ssh 服务的镜像
- java 使用c .dll_Windows下java调用c的dll动态库--Dev_Cpp编译c生成dll
- 数据库-使用Command对象进行数据库查询
- 排便的快感--不是非主流
- java读取csv文件忽略bom头_PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法...
- 中间件——activityMQ
- 基于 USB 传输的针式打印机驱动程序开发
- 监控摄像机选型攻略之常见机型选用
- 独孤木专栏Delayed Project(中)
- HTML元素分类:inline、inline-block、block
- python三年a班的成绩_Python题集:2019春Python程序设计选修课习题笔记
- html5 拓扑图 切片,HTML5复杂拓扑图(四) 组织结构图
- Jasper问题总结与解决方法~
- 微服务中自定义gateway网关过滤器
- 【苹果电脑装Windows7驱动大全、Macbook电脑win7驱动安装】
- Android屏幕背光调整机制
- 树莓派python3.7.3安装opencv、TensorFlow2.3
- Flutter Scaffold 参数详解
- 【ArcGIS】1. License Server Administrator点击启动没反应
热门文章
- php按每小时显示数据,mysql-PHP按某月统计每个小时生成的数据
- NASA 顶级程序员是如何编程的?这里有十大准则
- MFC对话框中的工具栏、状态栏设计小结
- MFC RadioButton用法详解
- 名词用作动词举例_日语动词修饰名词的形式
- c语言case的值能动态修改吗,java中的switch case语句中,case所对应的数目是不确定的,能否动态改变case...
- 用友二次开发_详解ERP系统与MES系统的数据传递——永康用友
- 数据结构与算法(C++)– 树(Tree)
- 工业用微型计算机(10)-指令系统(7)
- cuda-gpu计算随笔(1)