2012-06-07 3 views
1

Я хочу использовать анонимный тип в качестве источника для GridView. Но сначала он будет отфильтрован, используя раскрывающийся список. Поясню: я типа I определяется следующим образом:Использование анонимного типа в Gridview

IEnumerable<object> data = new[]{ 
    new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
    new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
    new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
      . . . 
    }; 

Я использую это в качестве источника к DropDownList:

ddlEmployee.DataSource=data; 
    ddlEmployee.DataTextField = "Name"; 
    ddlEmployee.DataValueField = "Id"; 
    ddlEmployee.DataBind(); 

Когда пользователь выбирает элемент из списка Я хочу, чтобы получить соответствующий объект и связать его в Gridview:

var sel = ddlEmployee.SelectedItem.ToString(); 

    var selData = from d in data where **d.Id= sel** select d; 
    gvSearchResults.DataSource = selData; 
    gvSearchResults.DataBind(); 

Но проблема в том, что, так как я доберусь д как объект, он выдает ошибку на d.Id.

Как это исправить. Обратите внимание, что я не могу изменить определение «данных», так как это контролируется вне приложения. Я просто показываю здесь для ясности.

+0

Возможный дубликат [Доступ к объектам анонимного типа C#] (http://stackoverflow.com/questions/713521/accessing-c-sharp-anonymous-type-objects) – nawfal

ответ

3

Ваша проблема в том, что вы используете Enumerable<object>. Когда вы ваш LINQ запрос будет сказать, что Id не является частью object

Попробуйте это вместо

var data = new[]{ 
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
     . . . 
}; 

Кроме того, я не знаю, если d.Id= sel является exaclty, что у вас есть (за исключением *) , Если это так, вам нужно изменить пару вещей

1) sel является string так что вам нужно, чтобы преобразовать его в int

2) Вы должны использовать == для сравнения

+0

Perfect !! Именно то, что я искал! –

+0

У меня есть еще один вопрос, связанный с этим: могу ли я передать и получить «данные» через объект сеанса? Что я должен использовать для кастинга? –

+0

@Rupesh Saini: это немного сложнее и не очень рекомендуется, для этого случая предпочтительный тип. Возможно, вы сможете сделать это, используя что-то, называемое «cast by example». см. этот связанный вопрос http://stackoverflow.com/questions/1409734/cast-to-anonymous-type –

1

Вы можете использовать «динамический» тип данных, так что-то вроде это работает:

 dynamic data = new[]{ 
      new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
      new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
      new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
     }; 

     Console.WriteLine(data[0].Name); 
бы

это поможет вам?

+0

тот же комментарий, что и для jadarnel27. Застрял с 3.5 :( –

+0

@RupeshSaini, обновляйся как можно скорее, у тебя пропадут причудливые вещи :) 4.5 почти здесь также;) – walther

1

Во-первых, вы хотите sel быть SelectedValue, а не SelectedItem (чтобы вы получили id недвижимость для вашего where). Вы также хотите, чтобы это было ИНТ, так что вы можете сравнить его с id в вашем LINQ запроса:

int sel = int.Parse(ddlEmployee.SelectedValue); 

Далее, вы можете установить IEnumerable как dynamic типизированного объекта, чтобы избежать ошибок компилятора вы упомянули :

IEnumerable<dynamic> data = new[]{ 
            new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29}, 
            new{Name="John Jones", Id=2, Sal=12000d, Age=27}, 
            new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21} 
           }; 

Наконец (as Caludio said), вы хотите использовать оператор == в вашем запросе LINQ:

var selData = from d in data where d.Id == sel select d; 

На этом этапе ваш DataBind() должен работать без проблем.

+0

Спасибо за ваше предложение. К сожалению, меня поразило 3.5, поэтому я не могу попробовать ваше решение, но я уверен, что он работает так +1 для вас –

+0

@RupeshSaini Ах, я всегда забываю, что 'dynamic' - это функция 4.0. Удачи, я рад, что тебе удалось помочь! – jadarnel27