C# 为什么对DataTable调用AsEnumerable()会阻止GridView绑定到它?

C# 为什么对DataTable调用AsEnumerable()会阻止GridView绑定到它?,c#,asp.net,data-binding,ado.net,ienumerable,C#,Asp.net,Data Binding,Ado.net,Ienumerable,在my.aspx页面中,我有一个控件,我像这样绑定它: public partial class InsertCustomer : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ViewCustomer(); } } private void Vie

在my.aspx页面中,我有一个
控件,我像这样绑定它:

public partial class InsertCustomer : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewCustomer();
        }
    }

    private void ViewCustomer()
    {
        var manager = new DomainManager();
        var result = manager.FindAll(new Customer());
        this.CustomerGridView.DataSource = result;
        this.CustomerGridView.DataBind();
    }
}
以下是
DomainManager
类:

public class DomainManager
{
    readonly StringBuilder _queryBuilder = new StringBuilder();
    private Type _entityType;
    readonly SQLHelper _sqlHelper = new SQLHelper();

    public IEnumerable FindAll<T>(T entity)
    {
        _entityType = entity.GetType();
        var query = string.Format("select * from {0}", _entityType.Name);
        var dt = _sqlHelper.FillDataTable(query);
        return dt.AsEnumerable();
    }
}
公共类域管理器
{
只读StringBuilder_queryBuilder=新StringBuilder();
私有类型_entityType;
只读SQLHelper _SQLHelper=new SQLHelper();
公共IEnumerable FindAll(T实体)
{
_entityType=entity.GetType();
var query=string.Format(“select*from{0}”,_entityType.Name);
var dt=_sqlHelper.FillDataTable(查询);
返回dt.AsEnumerable();
}
}
问题是我的网格没有被正确绑定。为什么不呢?

试着改变一下

return dt.AsEnumerable(); 

解释:默认情况下,
GridView
绑定到对象的实际属性。例如,如果数据源是
列表
,则可以绑定到每个
客户的
名称
属性。但是,如果数据源是客户的
数据表
,则每个客户都由
数据行
表示,并且
数据行
没有
GridView
可以绑定的
名称
属性

要支持动态属性,对象必须实现
ICustomTypeDescriptor
接口。此接口由
DataRowView
实现,但不是
DataRow
实现。通过将代码更改为返回
dt.DefaultView
(这是一个
DataView
),可以为
GridView
提供它可以绑定到的
DataRowView
对象的集合

现在你可能想知道为什么

this.CustomerGridView.DataSource = dt;
有效,但是

this.CustomerGridView.DataSource = dt.AsEnumerable();
没有


原因是
DataTable
实现了
IListSource
接口,它告诉
GridView
“不要使用我作为数据源,而是使用my
DefaultView
。”但是
AsEnumerable()
返回一个没有实现
IListSource
的包装器对象,因此,
GridView
不知道如何使用dt访问
DefaultView

。DefaultView给了我这个错误
enumerable没有实现IEnumerable
任何想法?你将DefaultView传递给什么?DataView实现了非通用的IEnumerable接口,但不是
IEnumerable
,因此不能直接将DefaultView传递给需要
IEnumerable
的对象。
this.CustomerGridView.DataSource = dt.AsEnumerable();