2010-01-23 2 views
0

У меня есть asp:DetailsView с несколькими столбцами, например. Foo, Bar.Fill DetailsView.DataSource с анонимным типом

Я хочу, чтобы заполнить его с анонимного типа, т.е .:

gridView.DataSource = new { Foo = 1, Bar = "2" }; 
gridVeew.DataBind(); 

Но получить следующую ошибку:

Data source is an invalid type. It must be either an IListSource, IEnumerable, or IDataSource.

Как я могу сделать то, что я хочу?

ответ

4

Свойство DataSource ожидает коллекцию. Значение, которое вы назначаете, не является коллекцией.

Вам нужно будет создать коллекцию и помещать анонимный типизированный экземпляр в эту коллекцию. Далее, вероятно, следует работать (хотя я не проверял с DataSource):

gridView.DataSource = new[] {new {Foo = 1, Bar = "2"}}; 
+0

Очень странно. Я попробовал это сам, но получил ту же ошибку. И после этого решил обратиться за помощью сюда. Поэтому мне пришлось перестроить проект или что-то в этом роде. Спасибо! – abatishchev

+1

Да, досадно, когда это произойдет! Во всяком случае, рад оказать помощь :) –

0

Вы должны иметь коллекцию, содержащую ваш анонимный тип.
Посмотрите на этот пример я нашел в this blog

static void Main(string[] args) 
{ 
    var Customer = new { FirstName = "John", LastName = "Doe" }; 
    var customerList = MakeList(Customer); 

    customerList.Add(new { FirstName = "Bill", LastName = "Smith" }); 
    //then you can bind this collection 
    gridView.DataSource = customerList; 
    gridVeew.DataBind(); 
} 

public static List<T> MakeList<T>(T itemOftype) 
{ 
    List<T> newList = new List<T>(); 
    return newList; 
}  
+1

Общий трюк метода хорош. Но в этом случае ненужным, поскольку DataSource не требует строго типизированной коллекции. –

+1

Правый Питер. Ваш ответ невероятно прост и умен – Matias

2

Другое решение:

var list = from item in myList 
     select new { Foo = item.Foo, Bar = item.Bar.ToString() }; 
gridView.DataSource = list; 
gridView.DataBind(); 

Который предполагает, что вы есть MyList из IEnumerable<T>

Смежные вопросы