2011-06-06 103 views
1

我被赋予为我们的产品设计ORM +对象模型的任务。它主要用于Windows + WinForms开发,但它现在也需要与我们的ASP.NET产品一起使用。ASP.NET GridView自定义绑定错误

但是,将Collection对象绑定到GridView似乎存在问题(并且我怀疑其他ASP.NET数据源控件)。

在线开发团队收到以下错误

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

我们使用集合对象使用“视图”收集处理排序/过滤(类似于数据视图如何与数据表),这是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

“FillMe()”内发生了什么? – Arief 2011-06-06 08:02:40

+0

您的DataSource将空值作为空字符串返回吗? – Akhil 2011-06-06 08:11:39

+0

“alumniShopItems”的类型是什么?及其基类和接口(如果有的话) – Eranga 2011-06-06 08:18:33

回答

0

我整理这一点,所以我要在这里把答案的情况下,任何人都遇到过这个问题。

这是由于事实IListSource.ContainsListCollection属性返回true(我的错,我误解了它试图做什么),改变这个,所以它返回false排序它。

奇怪的是,WinForms绑定行为正常工作正常,这就是为什么它以前没有问题,改变它,所以它返回false没有影响它在Windows上工作。

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

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