我被赋予了为我们的产品设计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>
<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();
答案 0 :(得分:0)
我已对此进行了排序,因此我将在此处提供答案,以防其他任何人遇到此问题。
这是因为IListSource.ContainsListCollection属性返回true(我的错,我误解了它试图做的事情),更改这个以便返回false对它进行排序。
奇怪的是,WinForms绑定行为已经很好地解决了这个问题,这就是为什么它之前没有出现问题,更改它以便返回false也不影响它在Windows上工作。
原因我很困惑最初我认为ContainsListCollection属性通知控件该列表有另一个列表,它希望它使用。现在我可以看到这个功能只是通过实现接口来实现的(我同意它非常有意义),并且属性指定返回的IList是否在其中有一个子集合并使用它。
我只能说感谢上帝为.NET源步进!尽管我必须在VM中执行它,因为我安装了Windows 7 SP1 ...