ASP.NET GridView自定义绑定错误

时间:2011-06-06 08:00:29

标签: .net asp.net data-binding gridview

我被赋予了为我们的产品设计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的关系),这是IListSource实现返回的'List'。但由于某种原因,ASP.NET控件对它不满意并抛出异常。

如果我在集合上使用Linq扩展方法'ToList',它会成功绑定 - 但将列表转换为列表似乎毫无意义,因为GridView绑定到也实现IListSource的DataTables,它必须是我做过的事情对象模型中的错误。

但是我有点迷失在哪里看,似乎大多数谷歌示例显示绑定到数据集,所以不是特别有帮助。

一如既往,欢迎任何见解。

修改


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>
                                     &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 :(得分:0)

我已对此进行了排序,因此我将在此处提供答案,以防其他任何人遇到此问题。

这是因为IListSource.ContainsListCollection属性返回true(我的错,我误解了它试图做的事情),更改这个以便返回false对它进行排序。

奇怪的是,WinForms绑定行为已经很好地解决了这个问题,这就是为什么它之前没有出现问题,更改它以便返回false也不影响它在Windows上工作。

原因我很困惑最初我认为ContainsListCollection属性通知控件该列表有另一个列表,它希望它使用。现在我可以看到这个功能只是通过实现接口来实现的(我同意它非常有意义),并且属性指定返回的IList是否在其中有一个子集合并使用它。

我只能说感谢上帝为.NET源步进!尽管我必须在VM中执行它,因为我安装了Windows 7 SP1 ...