2009-09-24 4 views
15

Im réglage du datasource avec le code suivant:colonnes d'accès en cas ItemDataBound lorsque la source de données est 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(); 
    } 

Maintenant, je veux savoir comment je peux accéder à 1 des colonnes (comme CustomerID) du ItemDataBound un événement.

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; 
    } 

J'ai compris que e.Item.DataItem contient tous les champs de ma requête et le type de e.Item.DataItem est

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

Répondre

-1

Vous n'êtes pas lier une datarow à votre control (vous liez un type anonyme), vous ne devez donc pas convertir DataItem en DataRow.

Essayez d'obtenir les données de cette ligne comme:

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

Je suis deux ans de retard au jeu sur celui-ci, mais personne d'autre a remarqué que cela ne compilera pas? "var" tente toujours de déduire le type de données au moment du design et comme c'est un type anonyme, il ne peut pas le faire. Ce code devrait vous donner l'erreur "Impossible de résoudre le symbole" CustomerID "sur la deuxième ligne La méthode de RobD est correcte en supposant que .NET 4.0 – Scott

35

enfin trouvé, était aussi simple que:

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

Cette approche 4.0 .Net est également très cool en effet!

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; 
    } 
} 

Tout crédit: http://www.kristofclaes.be/blog/2010/08/12/anonymous-types-and-the-itemdatabound-event/

Parce que la page affiche maintenant une erreur 404, voici la page de la Wayback Machine: Anonymous types and the ItemDataBound event (Archived version)

+0

votre lien dit erreur:> 404 Fichier non trouvé – AsifAli72090

+0

https://kristofclaes.github.io//blog/2010/08/12/anonymous-types-et-the-itemdatabound-event/non trouvé –

Questions connexes