2009-12-10 29 views
1

我有以下類一個DataGrid綁定到對象的列表時:添加記錄在一個WinForms應用程序

public class MyItems : List<MyItem> 
{ 
... 
} 

public class MyItem 
{ 
... 
} 

我實例化MyItems並將其分配給一個WinForms DataGrid的DataSource屬性。

一切正常顯示,但是當我嘗試添加行時,沒有任何反應。我所做的是將網格DataSource返回給MyItems,向其添加MyItems實例,然後將DataSource設置回列表。我可以遍歷代碼,看到數據源中項目的數量正在增加,但網格不顯示它們。有任何想法嗎?

//Form Load 
MyItems lstItems = new MyItems(); 
lstItems.Add(new MyItem("1")); 
lstItems.Add(new MyItem("2")); 

//Grid displays two rows; 
grd.DataSource = lstItems; 

//Add button click event 
MyItems lstItmes = (MyItems)grd.DataSource; 
lstItems.Add(new MyItem("3")); 

//Grid does not display new row 
grd.DataSource = lstItems; 

回答

3

爲了更改對數據源展現出來,它必須實現System.ComponentModel.IBindingList接口。這是提供ListChanged事件的接口,這是網格爲了發現列表(添加和刪除項目)或行(更改屬性值)的更改而掛鉤的接口。

此外,ITypedList接口允許設計人員發現屬性以及網格如何執行數據綁定,並且性能比基於反射的綁定更好。

如果您只是在尋找基本通知,並且您的基類已經繼承了類似List<T>之類的內容,請嘗試將父級更改爲System.ComponentModel.BindingList<T>。這已經實現了IBindingList接口。如果您想要排序或支持屬性更改通知等更高級的功能,則必須進行更多的工作,但它提供了基本添加和刪除的實現。