Bon chez moi ça marche, ça pédale quelques secondes, j'ai 300Mo de RAM chargés.
J'en ai profité pour amélioré un peu l'affichage.
D'abord une classe supplémentaire
class LogGroupe
{
public LogGroupe(IGrouping<string,Log> Groupe)
{
Key = Groupe.Key;
Logs = Groupe.ToList();
}
public string Key { get; set; }
public List<Log> Logs { get; set; }
public int Occurence { get { return Logs.Count; } }
public string Text { get { return string.Format("{0,-15}\t{1,7}\toccurence(s)", Key, Occurence); } }
}
Puis les 2 méthodes suivantes sont modifiées
private void DateTimePicher_ValueChanged(object sender, EventArgs e)
{
//les évènements ValueChanged de dtpDebut et dtpFin sont tous deux abonnées à cette méthode
IEnumerable<Log> logsFiltres = lesLogs.Where(l => l.Datation >= dtpDebut.Value && l.Datation <= dtpFin.Value);//requête qui filtre les logs par date
List<LogGroupe> logsGroupes = logsFiltres.GroupBy(l => l.Erreur).Select(g => new LogGroupe(g)).ToList();//regroupement des logs filtrés par erreur
lbxErreurs.DataSource = null;
lbxErreurs.DataSource = logsGroupes;
lbxErreurs.DisplayMember = "Text";//les logs groupés sont affichés dans la listBox
}
private void lbxErreurs_SelectedIndexChanged(object sender, EventArgs e)
{
//L'évènement SelectIndexChanged de la listBox est abonné à cette méthode.
if (lbxErreurs.SelectedIndex == -1)
return;// rien n'est sélectionné => on sort
ListBox lbx = sender as ListBox;
LogGroupe logGroupe = lbx?.SelectedItem as LogGroupe;
if (logGroupe == null)
return; //Y'a un problème => on sort
dgwLog.DataSource = null;
dgwLog.DataSource = logGroupe.Logs;//on affiche les log dans le créneau horaire, avec l'erreur sélectionnée
}
Projet complet https://www.dropbox.com/s/hsxm87vw4467mk9/Test%20Winform.zip?dl=0
6 févr. 2020 à 13:29