Сделайте так, чтобы источник данных gridview оставался в интерфейсе, а не на объекте - PullRequest
4 голосов
/ 27 марта 2009

У меня есть веб-приложение на C #, где у меня есть сетка, которая принимает List <>, который принимает интерфейс. Существует три типа объектов, которые реализуют интерфейс, который находится в списке.

Я установил источник данных gridviews в список и вызвал databind. Когда я запускаю приложение, я получаю следующую ошибку:

{"Property accessor 'Name' on object 'Bailey.Objects.Company' threw the following exception:'Object does not match target type.'"}

Я изменил порядок объектов в списке и обнаружил, что первый тип объекта работает отлично, но когда он находит первый экземпляр другого объекта, он выдает эту ошибку.

List<IBaileyObject> listToDisplay = listofItems;
GridViewItemList.DataSource = listToDisplay;
GridViewItemList.DataBind();

Я хотел, чтобы источник данных и привязка оставались на интерфейсе, а не передавались объекту, как это может показаться.

Это потому, что List <> возвращает объект сам по себе, а не интерфейс, или это что-то в сетке, которое его отбрасывает?

Или я иду по неверному пути?

Надеюсь, у кого-то есть способ исправить это, пожалуйста.

Спасибо

Джон Хокинс

EDIT

     <asp:TemplateField HeaderText="Selected">
                    <ItemTemplate>
                        <asp:CheckBox runat="server" ID="chkbox" Width="10%" Enabled="true" AutoPostBack="false" />
                    </ItemTemplate>
                </asp:TemplateField>

    <asp:BoundField DataField="ID" HeaderText="ID" Visible="False" />
    <asp:BoundField DataField="Name" HeaderText="Name" />
    <asp:BoundField DataField="TypeName" HeaderText="Type" />
</Columns>
<FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#E3EAEB" />    

<PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<EditRowStyle BackColor="#7C6F57" />
<AlternatingRowStyle BackColor="#F8F8F8" />    

Интерфейс предоставляет имя, идентификатор и имя типа.

"HeaderText =" ID "Visible =" False "/>

дает нельзя применять индексатор.

Ответы [ 3 ]

3 голосов
/ 06 января 2010

Мне действительно нравится это решение: http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

Он использует собственный класс BoundField, который использует Eval для возврата значений. Немного приятнее, чем использовать Evals на странице ASPX ...

1 голос
/ 27 марта 2009

Можете ли вы опубликовать часть своего кода GridView (особенно там, где вы ссылаетесь на ваши свойства IBaileyObject)?

Не зная, какой синтаксис вы используете, все усложняется, но вы пытались сделать что-то вроде этого:

<%# (((IBaileyObject)Container.DataItem)["PropertyX"]) %>

Надеюсь, это поможет

Редактировать после отправленного кода

Я думаю, это потому, что вы используете "BoundField" - они не настолько умны, чтобы понять, откуда взялся участник, на которого вы ссылаетесь. Мой совет - преобразовать ваши BoundFields в синтаксис привязки данных:

Либо: <%# Eval("Id") %> или <%# (((IBaileyObject)Container.DataItem)["Id"]) %>

Если этого не сделать, следуйте советам в этом сообщении в блоге и создайте пользовательский связанный элемент управления полем.

0 голосов
/ 26 февраля 2015
GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              {
                                  Id = x.Id,
                                  Name = x.Name                        
                              })
                              .ToList();
GridViewItemList.DataBind();
...