在我的.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();
}
}
问题是我的网格没有正确绑定。为什么不呢?
答案 0 :(得分:3)
尝试更改
return dt.AsEnumerable();
到
return dt.DefaultView;
说明:默认情况下,GridView
绑定到对象的实际属性。例如,如果数据源是List<Customer>
,那么您可以绑定到每个Name
的{{1}}属性。但是,如果数据源是Customer
个客户,那么每个客户都由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
。