为什么在DataTable上调用AsEnumerable()会阻止GridView绑定到它?

时间:2012-02-24 14:49:11

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

在我的.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();
    }
}

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

1 个答案:

答案 0 :(得分:3)

尝试更改

return dt.AsEnumerable(); 

return dt.DefaultView;

说明:默认情况下,GridView绑定到对象的实际属性。例如,如果数据源是List<Customer>,那么您可以绑定到每个Name的{​​{1}}属性。但是,如果数据源是Customer个客户,那么每个客户都由DataTable代表,而DataRow DataRow Name可以绑定的属性。

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

现在你可能想知道为什么

DataRowView

有效,但

this.CustomerGridView.DataSource = dt;

原因是this.CustomerGridView.DataSource = dt.AsEnumerable(); 实现了DataTable界面,告诉IListSource“不要将我用作数据源,而是使用我的GridView。”但是DefaultView返回一个没有实现AsEnumerable()的包装器对象,因此IListSource不知道如何到达GridView