C# 为什么对DataTable调用AsEnumerable()会阻止GridView绑定到它?
在my.aspx页面中,我有一个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
控件,我像这样绑定它:
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
“不要使用我作为数据源,而是使用myDefaultView
。”但是AsEnumerable()
返回一个没有实现IListSource
的包装器对象,因此,GridView
不知道如何使用dt访问DefaultView
。DefaultView给了我这个错误enumerable没有实现IEnumerable
任何想法?你将DefaultView传递给什么?DataView实现了非通用的IEnumerable接口,但不是IEnumerable
,因此不能直接将DefaultView传递给需要IEnumerable
的对象。
this.CustomerGridView.DataSource = dt.AsEnumerable();