2010-10-31 6 views
2

Je suis débutant à C# et j'ai du mal à essayer d'accéder à IList après l'avoir assigné à la requête. Voici mon code:convertir la requête de IList à l'objet

System.Collections.IList Invoices = 
    (from p in entities.InvoiceCards 
     where (p.CustomerCard.ID == CustomerID) 
     select new 
     { 
     InvoiceID = p.ID, 
     InvoiceDatetime = p.DateTime, 
     InvoiceTotal = (decimal) p.InvoiceTotal, 
     }).ToList(); 

// update the grid 
invoiceCardDataGridView.DataSource = Invoices; 

----------- Ici, le compilateur se plaint de l'objet c? comment puis-je accéder aux objets dans IList sans réexécuter la requête? J'ai besoin d'utiliser IList pour l'utiliser comme source de données. Quelle est la meilleure façon? S'il vous plaît inclure le code

foreach (var c in Invoices) 
    InvoiceTotal += (decimal)c.InvoiceTotal; 
+0

double possible de [C# Manipulation des objets de type Anonymous] (http://stackoverflow.com/questions/713521/accessing-c-sharp-anonymous-type-objects) – nawfal

Répondre

0

Si la liste contient des types anonymes et la boucle est foreach dans une autre méthode que le premier bloc de code que vous ne pouvez pas l'utiliser de cette façon.

Veuillez regarder this post qui pourrait peut-être vous aider dans votre cas.

0

Si vous devez absolument utiliser IList alors vous êtes mieux de définir un type explicite plutôt que d'utiliser un type anonyme. Ensuite, vous devrez convertir les éléments du IList en votre type explicite lorsque vous aurez besoin de travailler avec eux.

1

Votre problème que vous utilisez le type anonyme dans votre requête. Ainsi, lorsque vous obtenez un IList de ce type anonyme et que vous l'affectez à une source de données, vous perdez son type par défaut. Lorsque vous voulez le récupérer à partir de la source de données dans une autre partie de votre code, vous devez le convertir avec le type approprié. Puisque le type anonyme est généré par le compilateur, vous ne pourrez pas le convertir.

Une solution consiste à créer la classe qui contient le type s'il n'existe pas déjà.

public class InvoicePart 
{ 
    public int InvoiceID {get; set} 
    public DateTime InvoiceDatetime {get; set} 
    public decimal InvoiceTotal {get; set} 
} 

Maintenant, vous pouvez modifier votre requête pour obtenir une liste dactylographiée

List<InvoicePart> Invoices = 
    (from p in entities.InvoiceCards 
     where (p.CustomerCard.ID == CustomerID) 
     select new InvoicePart 
     { 
     InvoiceID = p.ID, 
     InvoiceDatetime = p.DateTime, 
     InvoiceTotal = (decimal) p.InvoiceTotal, 
     }).ToList(); 

// update the grid 
invoiceCardDataGridView.DataSource = Invoices; 

et quand vous obtiendrez vos données, vous jetteront à une liste

List<InvoicePart> Invoices = (List<InvoicePart>)invoiceCardDataGridView.DataSource; 

foreach (InvoicePart c in Invoices) 
{ 
    invoiceTotal += c.InvoiceTotal; 
} 
+0

Notez cette phrase clé: "Je dois utiliser' IList' pour l'utiliser comme source de données. " J'ai lu cela comme une version fortement typée de 'IList' n'étant pas une option (et notez que' IList 'n'est pas un' IList'). – jason

+0

J'ai noté cela et j'ai noté qu'il est un débutant à C#. J'ai donc essayé d'expliquer une alternative à l'utilisation de l'IList – Zied

+0

grâce à Zied. Cela a fonctionné pour moi –

0

Zied a le droit idée de résoudre ce problème. Notez cependant que la liaison à un List<T> n'est pas bidirectionnelle (les modifications apportées à la liste ne seront pas reflétées dans la grille). Pour cela, vous devez utiliser un BindingSource:

List<InvoicePart> Invoices = 
    (from p in entities.InvoiceCards 
     where (p.CustomerCard.ID == CustomerID) 
     select ... 

// update the grid 
var bs = new BindingSource(); 
bs.DataSource = Invoices; 
invoiceCardDataGridView.DataSource = bs; 
+0

Merci les gars qui ont aidé. –

+0

Pas de problème. Pensez à upvoting les réponses qui vous ont aidé et à accepter la réponse qui vous a le plus aidé (Mon vote va à Zied) –

Questions connexes