天天看點

使用BindingList來實作DataGridview資料源為list時的動态增删改

當DataGridview的資料源list的時候,對list進行操作後重新綁定,資料并不會更新

使用BindingList能很好的解決這個問題(framework2.0新增)

例如,使用list時候的代碼

/// <summary>
    /// 性别類型維護
    /// </summary>
    public partial class SexFrm : Form
    {
        IList<SystemCode> list;
      
       

        private void BindData()
        {
            list =new SystemCodeManager().GetModelByType(type);
            dgvSexType.DataSource = list;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            SystemCode sys = new SystemCode();
            sys.CodeNo = "";
            sys.EnglishName = "";
            sys.ID = 12312;
            sys.Name = "";
            sys.QuickSign = "";
            sys.Remark = "";
            sys.Type = type;
            list.Add(sys);

        }
}
      

  這樣的情況下,資料源改變,實際顯示資料并沒有改變

即時你在add的方法裡重新綁定資料源

dgvSexType.DataSource = list;      
依然如此.      
在此,使用BindingList就可以很好的解決這個問題了.      
/// <summary>
    /// 性别類型維護
    /// </summary>
    public partial class SexFrm : Form
    {
        int type = 2;
        SystemCodeManager sysManager = new SystemCodeManager();
        BindingList<SystemCode> list;
     

        private void SexFrm_Load(object sender, EventArgs e)
        {
            new BaseCode.LanguageSeting().LoadLanuageSettings(this);
            BindData();
        }

        private void BindData()
        {
            list = new BindingList<SystemCode>(new SystemCodeManager().GetModelByType(type));
            dgvSexType.DataSource = list;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            SystemCode sys = new SystemCode();
            sys.CodeNo = "";
            sys.EnglishName = "";
            sys.ID = 12312;
            sys.Name = "";
            sys.QuickSign = "";
            sys.Remark = "";
            sys.Type = type;      
list.Add(sys);      
}
      
}      

  

這樣子,就可以輕松的實作和DataGridview互動了      
效果如圖      
點選新增後可以直接新增,如果使用list,就沒有任何反應      
使用BindingList來實作DataGridview資料源為list時的動态增删改
注意:BindList需要引用System.ComponentModel命名空間      

面向對象中集合類一般都會實作接口IbindingList, 因為 ,在綁定資料源的時候,如果資料源實作了IbindingList 那麼界面可以與之實行互動。無意中發現了微軟在2.0增加了一個新類,BindingList<T>,這個類從Collection<T>斷承,并實作了IbindingList.

IbindingList 的魅力之處就在于他有AddNew,ApplySort,ListChangedEventHandler 等方法。而BindingSource 是控件的資料源和真正的資料源之間的橋梁,它可以調用IbindingList 的數AddNew等方法。同時IbindingList有資料發生改變的時候又會通知BindingSource進而更新界面。

MS 的 BindingList<T>還不支援sort ,search.,這是因為不知T為何東東有關系,要想實作些功能隻有自己擴充了。BindingList<T>有點遺憾的是沒有記下删除的資料,這與功能強大的表還是無法相比。從面向對象都已經到面向方面了,怎麼在基礎類中對面向對象支援還是不太完美呢。現在在研究,對象實體,集合,歡迎各位大師前來指教。

下面是MSDN上對BindingListr 的說明,代碼示例示範如何綁定到一個包含業務對象的 BindingList 元件。

http://msdn2.microsoft.com/zh-cn/library/ms132679.aspx#Mtps_DropDownFilterTextBindingList 類可以用作建立雙向資料綁定機制的基類。BindingList 提供IBindingList 接口的具體泛型實作。這樣就不必實作完整的 IBindingList 接口,實作完整接口可能會因 IBindingList、IEditableObject 和關聯的 CurrencyManager 之間微妙的互動而變得比較困難。不過,典型的解決方案程式員将使用提供資料綁定功能的類(如 BindingSource),而不是直接使用 BindingList。

BindingList 通過可擴充的 AddNew 方法支援工廠建立的執行個體。(在 BindingSource 等其他類中也存在這種類型的擴充性)此外,由于此類實作 ICancelAddNew 接口,是以它通過 EndNew 和 CancelNew 方法實作新項的事務性送出或復原。

使用BindingList來實作DataGridview資料源為list時的動态增删改