[译自MS发布的一个有关数据绑定的FAQ]

默认情况下,简单数据绑定把对绑定的数据源的更新作为控件验证操作的一部分。控件验证发生在控件失去焦点的时候,而控件失去焦点发生在用户使用Tab键或者鼠标点击离开控件的时候。如果在验证处理过程中发生了一个错误,Windows窗体将取消验证操作,并且焦点将不会移动到下一个控件。例如,假设你把TextBox的Text属性绑定到一个数据源的整型属性上,当用户把焦点移出TextBox的时候,验证操作发生了,并且数据绑定引擎(Binding类型)将试图用被绑定控件的值(TextBox.Text)更新数据源属性,如果在数据源更新过程中一个错误(异常)发生了,绑定引擎的默认行为将使验证操作失败,并阻止焦点离开这个TextBox。

需要特别注意的是,如果一个错误发生了,那么绑定引擎必须假定显示给用户的值(TextBox.Text)与数据源属性中的值是不一致的。在这种情况下,重要的是或者让用户感觉好像绑定成功了(安静的失败),或者显示一个扰人的对话框。因为这个原因,默认的行为是把用户限制到这个控件上,直到他们输入一个正确的值。

在VS2005中,有2个方法可以在一个绑定发生错误时向用户提供反馈。其中最简单的方法是添加一个ErrorProvider到窗体,然后设置ErrorProvider.DataSource到与绑定相同的数据源。另一种方法,你可以为绑定添加一个BindingComplete事件的处理方法,并且在这个处理方法中写入你自己的错误处理逻辑。

例子:(原文中的例子,因为加入了很多checkbox供条件选择,虽然执行效果上不错,但是代码反而有些零乱,因此我在这里自己提供2个简单示例)

示例一(利用ErrorProvider):

//在窗体中加入一个属性

private int m_PropertyOfInt;

public int PropertyOfInt

{

get { return m_PropertyOfInt; }

set { m_PropertyOfInt = value; }

}

//在窗体中加入一个TextBox,命名为tb,再加入另外一个TextBox,命名为tb2,加入一个ErrorProvider组件,命名为ep

//在窗体构造方法中写入如下代码:

public Form1()

{

InitializeComponent();

//加入如下代码

ep.DataSource = this;

Binding tbBind = new Binding("Text", this, "PropertyOfInt", true);

tb.DataBindings.Add(tbBind);

}

编译运行,在tb中输入几个非数字字符,然后按Tab键或者用鼠标点击tb2,这时,应该可以看到在tb右侧会出现ErrorProvider的红色叹号错误警示,同时焦点仍在tb中。

示例二(自定义错误处理,让焦点即使在发生错误之后也可以移出被绑定控件):

//参照示例一同样加入PropertyOfInt属性,tb1和tb2,但是不需要加入ErrorProvider

public Form1()

{

InitializeComponent();

Binding tbBind = new Binding("Text", this, "PropertyOfInt", true);

tb.DataBindings.Add(tbBind);

tbBind.BindingComplete += delegate(object sender, BindingCompleteEventArgs e)  //VS2005 支持匿名委托

{

if (e.Exception != null)

{

MessageBox.Show(e.Exception.Message);  //显示一个消息框

//或者:MessageBox.Show(e.ErrorText);

e.Cancel = false;  //不取消事件的值,结果是焦点可以移动到下一个控件,但是此时TextBox.Text将和PropertyOfInt的值不一致

}

};

}

转载于:https://www.cnblogs.com/Ricky81317/archive/2006/12/23/601013.html

在用数据绑定的时候我为什么不能把焦点移出(Tab out)我的控件?(译)相关推荐

  1. 深入学习SAP UI5框架代码系列之六:SAP UI5控件数据绑定的实现原理

    这是Jerry 2021年的第 7 篇文章,也是汪子熙公众号总共第 278 篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加 ...

  2. vb.net datagridview数据批量导入sql_【自学C#】|| 笔记 44 ComboBox:组合框控件数据绑定...

    一.ComboBox:组合框控件数据绑定 在 Windows 应用程序中很多控件都提供了 DataSource 属性,并将 DataSet 或 DataTable 的值直接赋给该属性,这样在控件中即可 ...

  3. 04、数据绑定控件 ListBox 的一个 Bug

    同事这两天在做 universal 项目的时候,遇到一个诡异的问题,即使设置 Page 为 缓存状态, 在页面跳转后, ListBox 的位置不会被缓存,怀疑是页面的缓存状态出了问题: this.Na ...

  4. 使用objectdatasource结合数据绑定控件进行简单三层架构的开发

    对于B/S架构的三层架构的开发,可能很多的人都已经了解的是比较清楚的.哪么我在这里用的是最简单的三层架构.ui+bll+dal+dbsqlhelp+model. 从05出来以后由于功能明显比03夸张了 ...

  5. ASP.NET 数据绑定控件(转)

    ListBox.GridView.Repeater这三个数据绑定控件的"高效分页",ListBox和GridView内置的有分页,但是其效率太低了,少量的数据还可以,大量的数据根本 ...

  6. 数据绑定控件之ListView

    一.绑定控件之ListView 在往下进行前我们下来讨论下Asp.net的特性,对于Asp.net微软为我们封装了众多的控件,将控件拖拽到页面上就可以使用控件进行编程,而且值得称道的是有些封装良好的控 ...

  7. 数据绑定控件之DataList

    上篇博客讨论了Repeater控件的基本用法,它是最基本的数据绑定控件,只提供了数据绑定的功能,熟练运用Repeater控件后,其它类似的数据绑定控件就很简单了.接着我们上篇博客的内容继续,今天来讨论 ...

  8. 数据绑定控件之Repeater

    前几篇的文章在说AJAX的内容,利用AJAX技术能够开发出高效运行的网站应用程序,不过在进行B/S项目开发时只拥有AJAX技术是远远不够的,踏入到B/S要学的东西会更多,但相较C/S的复杂逻辑结构来说 ...

  9. Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

    原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...

最新文章

  1. webservice restful一个小例子
  2. juddi MySQL_JUDDI v3部署并连接MySQL数据库
  3. C++虚函数Demo - Win32 版本
  4. android版 eclipse
  5. hystrix基于request cache请求缓存技术优化批量数据查询接口
  6. tcp状态转换--三次握手/四次挥手
  7. brew update失败提示:/System/Library/Frameworks/Ruby.framework/。。。解决方法
  8. 守护线程和非守护线程
  9. php 改变地址栏,php如何修改url
  10. 图像梯度-Sobel算子
  11. 水电缴费系统php源码_CBMS水电预付费系统
  12. mysql +cobar_数据库中间件Cobar功能探究
  13. 苹果笔记本风扇测试软件,实用的mac电脑风扇控制软件 Macs Fan Control Pro
  14. CSAPP 第三版 第四章 家庭作业and so on
  15. 12.3 文本查询程序
  16. 如何关闭电脑的休眠功能
  17. Elasticsearch 入门到精通-Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica
  18. pool win10提示bad_Win10怎么修复出现bad pool header蓝屏的情况?
  19. ABBYY FineReader 14的新增功能有哪些?
  20. 历年高考高校录取分数线

热门文章

  1. 洛谷 1541 乌龟棋
  2. puppet子命令介绍
  3. 布线须知:无线AP采用PoE交换机供电的好处
  4. 《HBase企业应用开发实战》—— 2.5 停止HBase集群
  5. Sql Server数据库数据导入到SQLite数据库中
  6. Linux守护进程简介
  7. javascript写计数器
  8. asp.net小技巧:摆脱路径的困扰(三)
  9. Prometheus 由于时间不同步导致数据不显示
  10. Spring的静态代理和动态代理