2009-09-24 12 views
15

Im ustawienie źródło danych z następującego kodu:dostępu kolumny w przypadku ItemDataBound gdy źródło danych jest LINQ

protected void Page_Load(object sender, EventArgs e) 
    { 
     var vacancies = from v in db.Vacancies 
        join c in db.Customers on v.CustomerID equals c.CustomerID 
        join cp in db.CustomerPortals on c.CustomerID equals cp.CustomerID 
        where cp.PortalID == Master.Portal.ID 
        select new 
        { 
         Title = v.Title, 
         Internship = (v.ContractID == 6), 
         Hours = v.Hours, 
         City = v.Customer.City.Name, 
         Degree = v.Degree.Title, 
         Contract = v.Contract.Title, 
         CustomerID = v.CustomerID 
        }; 
     rVacancies.ItemDataBound += new RepeaterItemEventHandler(rVacancies_ItemDataBound); 
     rVacancies.DataSource = vacancies; 
     rVacancies.DataBind(); 
    } 

Teraz chcę wiedzieć, w jaki sposób mogę uzyskać dostęp do 1 z kolumn (jak CustomerID) z ItemDataBound zdarzenie.

void rVacancies_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     // This doesnt seem to work, row would be null even though e.Item.DataItem has a value. 
     DataRow row = (DataRow)e.Item.DataItem; 
    } 

I zorientowali się, że e.Item.DataItem zawiera wszystkie pola z mojego zapytania i rodzaj e.Item.DataItem jest

f__AnonymousType8<string,bool,byte,string,string,string,long> 

Odpowiedz

-1

Nie jesteś wiązania datarow do listy control (wiążesz typ anonimowy), więc nie powinieneś używać DataItem do DataRow.

Spróbuj uzyskać dane twoim rzędzie jako:

var dataItem = e.Item.DataItem; 
// For example get your CustomerID as you defined at your anonymous type : 
string customerId = dataItem.CustomerID; 
+9

Więc jestem dwa lata późno do gry na tym, ale nikt inny nie zauważył, że to się nie skomplikuje? "var" nadal próbuje wywnioskować typ danych w czasie projektowania, a ponieważ jest to typ anonimowy, nie może tego zrobić. Ten kod powinien dać błąd "Nie można rozwiązać symbolu" IDklienta "w drugim wierszu. Metoda RobD jest poprawna przy założeniu .NET 4.0. – Scott

35

Wreszcie znalazł, było tak proste, jak następuje:

long customerID = long.Parse(DataBinder.Eval(e.Item.DataItem, "CustomerID").ToString()); 
33

Podejście .Net 4.0 jest również bardzo fajne rzeczywiście!

public void PersonDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     dynamic person = e.Item.DataItem as dynamic; 

     string name = person.Name; 
     int age = person.Age; 
    } 
} 

Wszystko kredytowe: http://www.kristofclaes.be/blog/2010/08/12/anonymous-types-and-the-itemdatabound-event/

Ponieważ strona teraz pokazuje błąd 404, tutaj jest strona z Wayback Maszyna: Anonymous types and the ItemDataBound event (Archived version)

+0

Twój link wskazuje błąd:> 404 Plik nie został znaleziony – AsifAli72090

+0

https://kristofclaes.github.io//blog/2010/08/12/anonymous-types-and-the-itemdatabound-event/not found –

Powiązane problemy