在用数据绑定的时候我为什么不能把焦点移出(Tab out)我的控件?(译)
[譯自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)我的控件?(译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BTS06]BizTalk2006 S
- 下一篇: 从人的角度分析进销存管理的需求