2013-07-11 56 views
2

如果成員被保存在基類類型列表中,是否有任何方法讓DataGridView顯示派生類的屬性,其中屬性不存在?說我有以下幾點:使用DataGridView在使用基類對象列表時顯示派生類對象的屬性

public class MyBaseClass 
{ 
public int MyPropertyBase { get; set; } 
//... 
} 

public class MyDerivedClass : MyBaseClass 
{ 
public int MyPropertyDerived { get; set; } 
//... 
} 

// Create list of type MyBaseClass, holding MyDerivedClass objects 
List<MyBaseClass> list = new List<MyBaseClass>(); 
list.Add(new MyDerivedClass(1)); 
list.Add(new MyDerivedClass(2)); 
list.Add(new MyDerivedClass(3)); 

// Declare DataGridView 
DataGridView dataGridView = new DataGridView(); 
dataGridView.AutoGenerateColumns = false; 

// Create display column for DataGridView 
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn(); 

當我綁定列表到DataGridView並顯示MyPropertyBase物業正常工作:

// Select MyPropertyBase to display in column 
col.DataPropertyName = "MyPropertyBase"; 
dataGridView.Columns.Add(col); 
dataGridView.DataSource = list; 

然而,如果不是我想用同樣的展現MyPropertyDerivedList<MyBaseClass>它不會工作,只顯示空單元格(雖然它顯示與我的列表中的項目對應的單元格的數量):

// Select MyPropertyDerived to display in column 
col.DataPropertyName = "MyPropertyDerived"; 
dataGridView.Columns.Add(col);  
dataGridView.DataSource = list; 

我真的需要將這個列表保存到我的抽象基類中,因爲它在遍佈整個代碼的其他地方使用。是否有任何方法可以將派生類的屬性暴露給DataGridView(如果它們存在,只顯示並清空單元格,如果該屬性不存在?真正有用的是讓每個派生類在綁定到DataGridView時顯示他們希望顯示的所有內容(通過屬性),並從列表中僅填入DataGridView

回答

2

一種方法是每個元素投退列表中,做下的變化,你會在DataGridView得到1,2,3:

col.DataPropertyName = "MyPropertyDerived"; 
dataGridView.Columns.Add(col); 
dataGridView.DataSource = list.ConvertAll(c => c as MyDerivedClass); 
+0

這是我認爲我堅持的解決方案。目前,我將嘗試將所有內容都轉換爲具有我想要的所有屬性的匿名類型。 –

+0

與此我你是否有權訪問派生的任何屬性,如果你的派生類也作爲一個名爲foo datapropertyname中的屬性,你可以放置字符串foo,它會顯示它的值。 – terrybozzio

1

如果實現ITypedList和修改方法的返回GetItemProperties這可以繞過數據綁定CurrencyManager的限制

+1

添加一個代碼示例 – HaveNoDisplayName

相關問題