业务对象到ListView

时间:2014-08-13 14:37:39

标签: c# asp.net sql-server

如果我解释这个问题很可怕,请原谅我。我有一个项目,我有独立的业务对象。我试图用其中一个业务对象创建一个asp:listview,但它一直告诉我它是一个无效的类型,甚至不显示。

业务对象逻辑在这里:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using WebStore.DatabaseHelper;
using System.Configuration;

namespace WebStore.BusinessObjectHelper
{
    public class ProductCategoryList
    {

        private BindingList<ProductCategory> _List = new BindingList<ProductCategory>();

        public BindingList<ProductCategory> List
        {
            get { return _List; }
        }

        public ProductCategoryList GetAll()
        {
            Database db = new Database(ConfigurationManager.AppSettings["store"]);
            db.Command.CommandType = System.Data.CommandType.StoredProcedure;
            db.Command.CommandText = "tblProductCategory_GetAll";
            DataSet ds = new DataSet();
            ds = db.ExecuteQuery();
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                ProductCategory pc = new ProductCategory();
                pc.Initialize(dr);
                pc.InitializeBusinessData(dr);
                pc.IsNew = false;
                pc.IsDirty = false;
                _List.Add(pc);
            }
            return this;
        }

        public ProductCategoryList Save()
        {
            for (int i = 0; i < _List.Count; i++)
            {
                if (_List[i].IsSavable())
                {
                    _List[i] = _List[i].Save();
                }
            }
            return this;
        }
    }
}

这就是我想要做的事情:

<div id="CategoryMenu" style="text-align: center">
    <asp:ListView ID="categoryList" runat="server" ItemType="WebStore.BusinessObjectHelper.ProductCategoryList" SelectMethod="GetAll">
        <ItemTemplate>
            <b style="font-size: large; font-style: normal">
                <a href="ProductList.aspx?id=<%# Eval("ID") %>">
                    <%# Eval("name") %>
                </a>
            </b>
        </ItemTemplate>
        <ItemSeparatorTemplate>| </ItemSeparatorTemplate>
    </asp:ListView>
</div>

我收到错误:

  

类型&#39; System.InvalidOperationException&#39;的例外情况发生在   System.Web.dll但未在用户代码中处理

     

其他信息:数据源是无效类型。肯定是   IListSource,IEnumerable或IDataSource。

在我的代码背后:

protected void Page_Load(object sender, EventArgs e)
    {
        categoryList.DataSource = new ProductCategoryList();
        categoryList.DataBind();
    }

    public ProductCategoryList GetCategories()
    {
        var _db = new WebStore.BusinessObjectHelper.ProductCategoryList();
        ProductCategoryList query = _db.GetAll();
        return query;
    }

我无法在asp:listview中显示此对象吗?

2 个答案:

答案 0 :(得分:0)

错误讯息......

  

其他信息:数据源是无效类型。它必须是 IListSource IEnumerable IDataSource

...告诉你什么是错的。那就是ListView类只知道如何“列出”继承/实现IListSource,IEnumerable或IDataSource类的东西。

您的业务对象ProductCategoryList需要实现其中一个接口,以便ListView可以迭代它。

namespace WebStore.BusinessObjectHelper
{
    public class ProductCategoryList: IEnumerable<ProductCategory>
    {
        // *implement the IEnumerable interface
    }
}

另见:https://stackoverflow.com/a/6908510/1718702

基本上你将自定义类交给ListView(它完全不知道你的类做了什么),并期望它猜测它应该用它做什么(并且它会引发异常)。你需要实现其中一个接口来说“ Here!这就是你应该如何正确使用我! ”。

答案 1 :(得分:0)

此方法未返回IEnumerable, or IDataSource.正在返回ProductCategoryList对象类型。

    public ProductCategoryList GetAll()
    {
     /*
          ...
     */
     return this;
    }

您可以更改方法GetAll()的返回类型或实现ProductCategoryList的接口,以使其成为IEnumerable