Попробуйте изменить
return dt.AsEnumerable();
на
return dt.DefaultView;
Объяснение: По умолчанию GridView
привязывается к фактическим свойствам объекта.Например, если источником данных является List<Customer>
, то вы можете связать со свойством Name
каждого 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
не знает, как добраться до DefaultView
.