Как связать данные в собственности в собственности - PullRequest
0 голосов
/ 08 октября 2008

У меня сейчас есть установка, подобная приведенной ниже

Public ClassA

property _classB as ClassB

End Class

Public ClassB

property _someProperty as someProperty 

End Class

что я хочу сделать, это привязать данные объекта A к сетке, причем один из столбцов привязан к ClassB._someProperty. Когда я пытаюсь связать его как Classb._someProperty, я получаю сообщение об ошибке «Поле или свойство не найдено в выбранном источнике данных»

Я попытался использовать objectContainerDataSource, а также напрямую связать его с gridview, но безуспешно.

Кто-нибудь сталкивался с этим в прошлом?

Ответы [ 2 ]

2 голосов
/ 08 октября 2008

Обычная привязка данных обычно не допускает выражения. В рамках сетки данных используется отражение (а не исполняемый код, как DataBinder.Eval на странице ASP.NET), чтобы найти свойство, которое вы указываете для привязки к столбцу. Чтобы сделать то, что вы хотите, необходимо оценить привязку как выражение, выяснить, что вы искали родительское -> дочернее отношение, а затем отразиться на этом уровне. AFAIK, встроенная привязка данных на сетке слишком тупа, чтобы знать, как это сделать.

Недавно у меня была такая же проблема, и я решил сделать проекцию LINQ и вместо этого связать ее с сеткой. Что-то вроде следующего (в C #, потому что меня не устраивает синтаксис LINQ в VB):

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 голосов
/ 08 октября 2008

Я нашел способ сделать это, используя поле шаблона и eval (см. Ниже)

Установите поле данных как свойство classB, а затем:

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

</ItemTemplate>
</asp:TemplateField>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...