c# 自定義類型的DataBindings


自定義類型TextBoxEx,擴展了TextBox,增加了一個屬性KeyText來保存后台的值(Tag已另作它用)。

程序里面需要將KeyText和DataTable的某個列綁定起來。

如果是TextBox,只需要簡單處理即可:

txt.DataBindings.Add("Text", dt, colName, false, DataSourceUpdateMode.OnPropertyChanged);

如此,即可實現textbox和Datatable列的綁定,無論哪一個有修改,都會自動作用到另一個。

現在綁定的對象變成擴展的自定義控件TextBoxEx下的自定義屬性KeyText,如上的綁定方式試過了,沒有效果。即改變TextBoxEx的KeyText值,相應的DataTable里面的列下的值不會改變。這是怎么回事呢,問題的關鍵在后面的那句DataSourceUpdateMode.OnPropertyChanged上,到底什么時候會觸發這個事件,又到底修改KeyText值的時候有沒有觸發這個事件呢。

原因沒找到,但是應該是沒有觸發上面的事件。

解決方案有兩種,第一種是我覺得比較挫的招,曲線解決。

這里的DataSourceUpdateMode下還有兩個選項,一個是Never,還有一個是OnValidation。Never沒什么功夫可做,可以在OnValidation上下手。

代碼:

public class TextBoxEx : TextBox
{
    string _keyText;

    [Browsable(false)]
    public string KeyText
    {
        get { return _keyText; }
        set
        {
            if (_keyText != value)
            {
                _keyText = value;               
                OnValidating(new CancelEventArgs(false));
            }
        }
    }
}

在KeyText的set里面加上OnValidating,手動觸發驗證事件。方案可行,只是感覺有點小挫。

 

第二招是武林正派,從OnPropertyChanged上面下功夫。

代碼:

public class TextBoxEx : TextBox, INotifyPropertyChanged
{
    string _keyText;

    [Browsable(false)]
    public string KeyText
    {
        get { return _keyText; }
        set
        {
            if (_keyText != value)
            {
                _keyText = value;             
                OnPropertyChanged("KeyText");              
            }
        }
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

繼承INotifyPropertyChanged,實現OnPropertyChanged,頓感高富帥了,有木有。

當然,上面兩種,在綁定的時候要分別選擇DataSourceUpdateMode.OnValidation和DataSourceUpdateMode.OnPropertyChanged。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM