当前位置:首页>编程日记>正文

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

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

默认情况下,简单数据绑定把对绑定的数据源的更新作为控件验证操作的一部分。控件验证发生在控件失去焦点的时候,而控件失去焦点发生在用户使用
Tab键或者鼠标点击离开控件的时候。如果在验证处理过程中发生了一个错误,Windows窗体将取消验证操作,并且焦点将不会移动到下一个控件。例如,假设你把TextBoxText属性绑定到一个数据源的整型属性上,当用户把焦点移出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属性,tb1tb2,但是不需要加入ErrorProvider

                     InitializeComponent();

 

                     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的值不一致

                            }

                     };

         }


http://www.coolblog.cn/news/5ae2fcc0814d8d5d.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐