2008-10-08 48 views
0

我cureently有一個設置像下面如何在屬性中數據綁定的屬性

Public ClassA 

property _classB as ClassB 

End Class 

Public ClassB 

property _someProperty as someProperty 

End Class 

我想要做的就是對象的數據綁定到一個GridView與一列是數據綁定到ClassB._someProperty 。當我嘗試數據綁定它作爲Classb._someProperty我得到一個錯誤

我曾嘗試使用objectContainerDataSource,也可以直接綁定到沒有成功的gridview的「字段或屬性不選擇數據源中發現」。

有沒有人遇到過這個?

回答

0

,我發現這樣做的方法是使用模板領域和eval (見下文)

設置數據字段財產CLASSB然後:

<asp:TemplateField HeaderText="_someProperty"> 
<ItemTemplate>  
          <%#Eval("classB._someProperty")%> 

</ItemTemplate> 
</asp:TemplateField> 
2

普通數據綁定通常不允許使用表達式。在數據網格下,datagrid使用反射(而不是DataBinder.Eval在ASP.NET頁面上執行的方式執行代碼)來查找您指定要綁定到列的屬性。要做你想做的事情,需要將綁定評估爲一個表達式,找出你正在尋找父 - >子關係,然後向下反射到那個級別。 AFAIK網格內置的數據綁定太愚蠢了,無法知道如何做到這一點。

我最近有同樣的問題,我的解決方案是做一個LINQ投影並將其綁定到網格。類似以下內容(在C#中,因爲我不舒服在VB中的LINQ語法):

IList<ClassA> listOfClassAObjects = GetMyListOfClassAObjectsFromSomewhere(); 
var projection = from ClassA a in listOfClassAObjects 
       select new { SomeProperty = a.SomeProperty, 
           SomeOtherProperty = a.SomeOtherProperty, 
           SomePropertyFromB = a.ClassB.SomeProperty }; 
datagrid.DataSource = projection; 
datagrid.DataBind(); 

你會得到包含投影匿名類型的列表,並且可以將相應的列綁定到SomePropertyFromB

對於額外的封裝(如果你這樣做了很多)把投影到一個擴展方法,所以你可以這樣做

var data = GetMyListOfClassAObjectsFromSomewhere().ProjectionForDataGrid(); 
datagrid.DataSource = data; 
datagrid.DataBind(); 
+0

這使用LINQ我相信這是唯一可用的後.NET 2.0。因爲我僅限於.net 2.0,還有其他方法嗎? – Dean 2008-10-08 12:54:33