【问题标题】:Why does calling AsEnumerable() on a DataTable prevent a GridView from binding to it?为什么在 DataTable 上调用 AsEnumerable() 会阻止 GridView 绑定到它?
【发布时间】:2012-02-24 14:49:11
【问题描述】:

在我的 .aspx 页面中,我有一个 <asp:GridView runat="server" ID="CustomerGridView"> 控件,我将其绑定如下:

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();
    }
}

问题是我的网格没有正确绑定。为什么不呢?

【问题讨论】:

    标签: c# asp.net data-binding ado.net ienumerable


    【解决方案1】:

    尝试改变

    return dt.AsEnumerable(); 
    

    return dt.DefaultView;
    

    解释:默认情况下,GridView 绑定到对象的实际属性。例如,如果数据源是List&lt;Customer&gt;,那么您可以绑定到每个CustomerName 属性。但是当数据源是DataTable 的客户时,每个客户都由DataRow 表示,而DataRow 确实Name 属性GridView 可以绑定到。

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

    现在你可能想知道为什么

    this.CustomerGridView.DataSource = dt;
    

    有效,但是

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

    没有。

    原因是DataTable实现了IListSource接口,它告诉GridView“不要用我作为数据源,用我的DefaultView代替。”但是AsEnumerable() 返回一个没有实现IListSource 的包装对象,所以GridView 不知道如何到达DefaultView

    【讨论】:

    • 使用 dt.DefaultView 给我这个错误enumerable does not implement IEnumerable&lt;&gt; 有什么想法吗?
    • 你将 DefaultView 传递给什么? DataView 实现了 non-generic IEnumerable 接口但不是 IEnumerable&lt;T&gt;,因此您不能直接将 DefaultView 传递给期望 IEnumerable&lt;T&gt; 的东西。
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2010-10-30
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多