ASP.NET GridView Ошибка пользовательской привязки - PullRequest
1 голос
/ 06 июня 2011

Мне было поручено разработать объектную модель ORM + для нашего продукта. Он в основном использовался для разработки Windows + WinForms, но теперь его необходимо использовать и с нашими продуктами ASP.NET.

Однако, похоже, существует проблема с привязкой объекта Collection к GridView (и я подозреваю, что другие элементы управления источником данных ASP.NET).

Команда разработчиков онлайн получает следующую ошибку

[HttpException (0x80004005): The IListSource does not contain a data source named ''. Check your DataMember value.]

Объект коллекции, который мы используем, использует коллекцию 'view' для обработки сортировки / фильтрации (аналогично тому, как DataView относится к DataTable), и это "List", который возвращает реализация IListSource. Но по какой-то причине элемент управления ASP.NET недоволен этим и выдает исключение.

Если я использую метод расширения Linq 'ToList' для коллекции, он успешно связывается - но преобразование списка в список кажется довольно бессмысленным, и поскольку GridView связывается с DataTables, которые также реализуют IListSource, это должно быть то, что я сделал неправильно в объектной модели.

Но я немного растерялся относительно того, где искать, кажется, что большинство примеров Google показывают привязку к набору данных, поэтому не особенно полезны.

Как всегда, любые идеи приветствуются.

редактировать


AlumniShopItems имеет тип:

DataObjectCollection<AlumniShopItem>

который является подклассом:

DataObjectCollection<T> : BindingList<T>, IListSource, IList<T>, IDataObjectCollection, IFillableList where T : DataObject

IListSource возвращает следующий типизированный список: ObjectListView<T>

который реализует следующие интерфейсы:

IBindingListView, IList<T>, ITypedList, IRaiseItemChangedEvents, ICancelAddNew, IDeserializationCallback


Спасибо

Marlon

Ниже приведен код, который они используют:

 <asp:GridView ID="ShopGrid" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="True"
                        OnRowEditing="ShopGrid_RowEditing" 
              OnRowUpdating="ShopGrid_RowUpdating" OnRowCancelingEdit="CancelEdit" 
              OnRowDataBound="RowBinding" >
                        <Columns>
                            <asp:TemplateField HeaderText="ID" Visible="false">
                                <EditItemTemplate>
                                     <asp:Label ID="Label1" runat="server" Text='<%#Bind("Ident")%>'></asp:Label>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="Label1" runat="server" Text='<%#Bind("Ident")%>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                              <asp:TemplateField HeaderText="Item Name" >
                                <EditItemTemplate>
                                     <asp:TextBox ID="NameText" runat="server" Text='<%#Bind("Name")%>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="NameLabel" runat="server" Text='<%#Bind("Name")%>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Pay Pal ID" >
                                <EditItemTemplate>
                                     <asp:TextBox ID="PayPalText" runat="server" Text='<%#Bind("PayPalID")%>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="PayPalLabel" runat="server" Text='<%#Bind("PayPalID")%>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Price" >
                                <EditItemTemplate>
                                     <asp:TextBox ID="PhotoPath" runat="server" Text="" > </asp:TextBox>
                                     &nbsp;&nbsp;&nbsp;
                                     <asp:Button ID="Upload" runat="server" Text="Upload" />
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Image ID="itemPhoto" runat="server" />
                                </ItemTemplate>
                            </asp:TemplateField>
                              <asp:TemplateField HeaderText="Price" >
                                <EditItemTemplate>
                                      <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%#Bind("Current")%>' Enabled="true" />
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%#Bind("Current")%>' Enabled="false" />
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>

Где-то при загрузке страницы:

Line 57:                 alumniShopItems.FillMe();
Line 58:                 ShopGrid.DataSource = alumniShopItems;
Line 59:                 ShopGrid.DataBind();

1 Ответ

0 голосов
/ 07 июня 2011

Я отсортировал это, поэтому я собираюсь поместить ответ здесь на случай, если кто-нибудь еще столкнется с этой проблемой.

Это было связано с тем, что свойство IListSource.ContainsListCollection возвращало true (мойошибка, я неправильно понял, что он пытался сделать), изменив это так, чтобы он возвращал ложь, отсортировал его.

Странно, но поведение привязки WinForms работало нормально, поэтому раньше это не было проблемой, меняяэто так, что это возвратило ложное, не затронуло это, работающее на окнах также.

Причина, по которой я был сбит с толку, - изначально я думал, что свойство ContainsListCollection сообщало элементу управления, что у списка есть другой список, который он хочет использовать.Теперь я вижу, что эта функциональность достигается только за счет реализации интерфейса (что, я согласен, имеет смысл), и свойство указывает, есть ли в возвращенном IList вложенная коллекция, и использует ее вместо этого.

Все, что я могу сказать, это слава богу за переход на источник .NET!несмотря на необходимость сделать это в виртуальной машине, потому что я установил Windows 7 SP1 ...

...