zoukankan      html  css  js  c++  java
  • 在用数据绑定的时候我为什么不能把焦点移出(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

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

                                }

                         };

             }


    理解的越多,需要记忆的就越少
  • 相关阅读:
    S5PV210开发板刷机(SD卡uboot、串口+USB-OTG刷机方法)
    S5PV210启动过程分析
    总结:ARM逻辑和高级C(朱老师物联网学习)
    C语言笔记(数组地址一些细节)
    shell脚本和常用命令
    ansible
    firewalld
    LAMP架构上线动态网站WordPress
    LNMP架构上线动态网站
    Tomcat集群 Nginx负载均衡 shell脚本实时监控Nginx
  • 原文地址:https://www.cnblogs.com/Ricky81317/p/601013.html
Copyright © 2011-2022 走看看