ASP.NET Ошибка пользовательской привязки GridView

#.net #asp.net #data-binding #gridview

#.net #asp.net #привязка данных #gridview

Вопрос:

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

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

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

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

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

Если я использую метод расширения Linq ‘ToList’ для коллекции, он успешно привязывается, но преобразование списка в list кажется довольно бессмысленным, а поскольку GridView привязывается к таблицам данных, которые также реализуют 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


Спасибо

Марлон

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

  <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>
                                     amp;nbsp;amp;nbsp;amp;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. что происходит внутри «FillMe()»?

2. Возвращает ли ваш источник данных нулевые значения в виде пустых строк?

3. какой тип alumniShopItems ? и его базовые классы и интерфейсы, если таковые имеются

4. «FillMe()» отправляется в базу данных, для каждой найденной строки заполняет объект и добавляет его в коллекцию. Что касается возврата нулевых значений, я не совсем уверен, что вы имеете в виду, но нет, они будут нулевыми.

5. информация о типе для alumniShopItems теперь включена в редактирование.

Ответ №1:

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

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

Как ни странно, поведение привязки WinForms работало нормально, вот почему раньше это не было проблемой, изменение его, чтобы оно возвращало false, также не повлияло на его работу в Windows.

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

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