今天在编写代码的时候碰到了控件的验证问题。

命题:在前台的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控件的事件发生顺序相关推荐

  1. 深入了解DataGridView控件

     DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需 ...

  2. DataGridView控件使用大全

    原文地址为: DataGridView控件使用大全   DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid ...

  3. C# DataGridView控件用法

    方法一: int index = this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[1].Value = &quo ...

  4. Winform DataGridView控件添加行号

    有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: 1 e.Row.Hea ...

  5. (转)使用DataGridView控件常见问题解答

    1.    如何使指定的单元格不可编辑? ReadOnly属性决定了单元格中的数据是否可以编辑,可以设置单元格的ReadOnly 属性,也可以设置DataGridViewRow.ReadOnly 或D ...

  6. html asp textbox,ASP.NET中 TextBox 文本输入框控件的使用方法

    TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属性 说明 AutoPostBack 获 ...

  7. C#中DataGridView控件使用大全

    c datagridview 分类: C/C++/C# DataGridView 动态添加新行: DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自 ...

  8. 转——C# DataGridView控件 动态添加新行

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...

  9. C# DataGridView控件动态添加行与列

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...

最新文章

  1. 【国内首家】第一个基于语音生成实时知识图谱的系统来啦!!!
  2. 创建ssh 服务的镜像
  3. java 使用c .dll_Windows下java调用c的dll动态库--Dev_Cpp编译c生成dll
  4. 数据库-使用Command对象进行数据库查询
  5. 排便的快感--不是非主流
  6. java读取csv文件忽略bom头_PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法...
  7. 中间件——activityMQ
  8. 基于 USB 传输的针式打印机驱动程序开发
  9. 监控摄像机选型攻略之常见机型选用
  10. 独孤木专栏Delayed Project(中)
  11. HTML元素分类:inline、inline-block、block
  12. python三年a班的成绩_Python题集:2019春Python程序设计选修课习题笔记
  13. html5 拓扑图 切片,HTML5复杂拓扑图(四) 组织结构图
  14. Jasper问题总结与解决方法~
  15. 微服务中自定义gateway网关过滤器
  16. 【苹果电脑装Windows7驱动大全、Macbook电脑win7驱动安装】
  17. Android屏幕背光调整机制
  18. 树莓派python3.7.3安装opencv、TensorFlow2.3
  19. Flutter Scaffold 参数详解
  20. 【ArcGIS】1. License Server Administrator点击启动没反应

热门文章

  1. php按每小时显示数据,mysql-PHP按某月统计每个小时生成的数据
  2. NASA 顶级程序员是如何编程的?这里有十大准则
  3. MFC对话框中的工具栏、状态栏设计小结
  4. MFC RadioButton用法详解
  5. 名词用作动词举例_日语动词修饰名词的形式
  6. c语言case的值能动态修改吗,java中的switch case语句中,case所对应的数目是不确定的,能否动态改变case...
  7. 用友二次开发_详解ERP系统与MES系统的数据传递——永康用友
  8. 数据结构与算法(C++)– 树(Tree)
  9. 工业用微型计算机(10)-指令系统(7)
  10. cuda-gpu计算随笔(1)