2016-01-10 3 views
0

sur WPF Je construis ce code Je veux montrer sur DataGrid la somme de "Desc" pour chaque "PID"Retour IGrouping de anonymous IEnumerable à présent sur DataGrid

public class Event 
{ 
    public int PID { get; set; } 
    public int Desc { get; set; } 
} 

private List<Event> data; 
public MainWindow() 
{ 
    InitializeComponent(); 
    data = new List<Event>() 
    { 
     new Event() { PID = 1, Desc=2 }, 
     new Event() { PID = 1, Desc=3 }, 
     new Event() { PID = 2, Desc=4 }, 
     new Event() { PID = 2, Desc=5 }, 
     new Event() { PID = 3, Desc=6 } 
    }; 

    var result = 
     from d in data 
     group d.Desc by d.PID into pg 
     select new { ID = pg.Key, SUM = pg.Sum() }; 

    datagrid.ItemsSource = result; 
} 

Et le XAML est

<DataGrid Name="datagrid" AutoGenerateColumns="False" IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="id" Binding="{Binding ID}" Width="*"/> 
     <DataGridTextColumn Header="Name" Binding="{Binding SUM}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 

qui fonctionnent bien! mais ce n'est pas bon,

Ce que je veux faire est de retourner ce "var résultat" de la fonction et de la liaison comme je l'ai fait à DataGrid Comment puis-je faire cela? Ceci est à partir de IEnumerable<IGrouping<int,???>> sur ??? il ya un type anonyme ....

alors comment puis-je retourner cela de la fonction et de la liaison comme je l'ai fait sur DataGrid?

Merci!

+0

Vous pouvez simplement retourner 'IEnumerable' si cette méthode sera utilisée pour lier la liste de _things_. 'private IEnumerable GetData()'. Depuis [ItemsSource] (https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource (v = vs.110) .aspx) la propriété accepte 'IEnumerable' cela devrait aller. – Michael

Répondre

1

Vous avez besoin d'une classe pour représenter chaque élément de votre séquence. De cette façon, votre résultat ne serait pas une séquence d'objets d'un type anonyme, mais une séquence d'objets d'un type spécifique.

public class Result 
{ 
    public int Id { get; set;} 
    public int Sum { get; set; } 
} 

Ensuite, vous allez définir une méthode comme ci-dessous:

public IEnumerable<Result> GetResults() 
{ 
    data = new List<Event>() 
    { 
     new Event() { PID = 1, Desc=2 }, 
     new Event() { PID = 1, Desc=3 }, 
     new Event() { PID = 2, Desc=4 }, 
     new Event() { PID = 2, Desc=5 }, 
     new Event() { PID = 3, Desc=6 } 
    }; 

    var result = from d in data 
       group d.Desc by d.PID into pg 
       select new Result 
       { 
        Id = pg.Key, 
        Sum = pg.Sum() 
       }; 

    return result; 
} 

puis dans votre méthode MainWindow vous appeler cette méthode.

public MainWindow() 
{ 
    InitializeComponent(); 
    datagrid.ItemsSource = GetResults(); 
} 

J'ai supposed que vous avez défini cette méthode dans la même classe. Il est tout à fait possible que ce ne soit pas une bonne pratique. Donc, si vous définissez cette méthode dans une autre classe, vous devez d'abord créer un objet de cette classe, puis appeler la méthode GetResults de cet objet.

En outre, j'ai essayé de faire un léger changement dans la dénomination. Il est plus commun d'utiliser le nom de chameau et de ne pas utiliser de lettres majuscules pour toutes les lettres. Cela étant dit, vous devez également faire un léger changement dans votre code xaml.

<DataGrid Name="datagrid" AutoGenerateColumns="False" IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="id" Binding="{Binding Id}" Width="*"/> 
     <DataGridTextColumn Header="Name" Binding="{Binding Sum}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

mais comment vous pouvez définir comme résultat que ce est Igouping de type int et Anonimus .... comment le type de retour est IEnumerable ici ce que je cherche à accorind Yiu ... – jordan

+0

Le résultat du groupe 'by' est un 'IGrouping'. Ensuite, vous projetez les valeurs de 'IGrouping' sur une séquence de' Result'. Notez que pour chaque groupe, pg, vous créez un nouvel objet 'Result'. C'est comme dans ton code original. A la fin vous n'aviez pas de résultat 'IGrouping' mais une séquence d'objets d'un type anonyme. – Christos

+0

Notez ici 'select nouveau'. Vous avez oublié le 'Result',' select new Result'. – Christos