IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rechercher des infos dans une listeview


Sujet :

C#

  1. #1
    Membre à l'essai
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Rechercher des infos dans une listeview
    Bonjour,

    J'ai des informations qui s'affiche dans une listview à partir de la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                var contextBdd = BuslabModel.GetContext();
                var donnees = contextBdd.raw_data.Where(b => b.id_bus_raw == idBus && b.date.ToString() == date.ToString()).
                    Select(s => new { s.longitude, s.latitude, s.id_event_raw, s.odometer, s.impulsions, s.date, s.id_bus_raw });
    Les informations s'affichent bien dans la listeview, aucun pb. Maintenant j'aimerais dire que si dans les informations récupérées par exemple dans la colonne impulsions, il y a une valeur différente de 0, j'affiche le message OK dans un label.
    Pour ça, j'ai essayé quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var impulsions = donnees.Select(c => c.impulsions).ToString();
               for (int i = 0; i < donnees.Count(); i++)
                {
                       if (impulsions .ToString() != "0")
                        {
                            label11.Text = OK;
                        }
                 }
    Mais ça ne marche pas, ça fait planter l'affichage de mon winform. Comment feriez-vous pour traiter les infos récupérées dans la listview?

    Merci d'avance,

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Plusieurs points :

    Mais ça ne marche pas, ça fait planter l'affichage de mon winform.
    Ce ne sont pas des symptômes qui permettent de diagnostiquer une maladie, il va falloir être plus précis : est-ce-que la fenêtre s'affiche ? Est-ce-que le contrôle n'est pas modifié ? Est-ce-qu'il y a un freeze de l'interface ? Est-ce-qu'il y a un crash avec une exception de levée (quel type, quel message d'erreur, que contient la stacktrace) ?

    Tu donnes des morceaux de code épars, sans contexte, aucune idée si le problème vient de là ou d'ailleurs.

    var impulsions = donnees.Select(c => c.impulsions).ToString(); doit te donner quelque chose du genre "System.Linq.Select", ce ne sera pas très utile à ton traitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var contextBdd = BuslabModel.GetContext();
    var donnees = contextBdd.raw_data.Where(b => b.id_bus_raw == idBus && b.date.ToString() == date.ToString()).
        Select(s => new { s.longitude, s.latitude, s.id_event_raw, s.odometer, s.impulsions, s.date, s.id_bus_raw });
    Est-ce-que tu connais avec Linq la différence entre l'exécution différée et l'exécution immédiate ? Parce-qu'il me parait très possible que sans ça tu exécutes plusieurs fois certaines requêtes, potentiellement sur une source de données déjà disposée.

    En bref il manque beaucoup d'informations pour qu'on puisse t'aider.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Re,

    La fenêtre ne s'ouvre pas, il y a un freeze de l'interface sans aucun crash. Pas d'exception levée ni de stacktrace. Le showdialog est bien appelé mais après ça, c'est un arrêt total de l'exécution. La seule sortie que j'ai est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le thread 0x381c s'est arrêté avec le code 0 (0x0)....
    Pour la différence entre l'exécution différée et l'exécution immédiate, je vois un peu mieux en recherchant sur le web mais je ne maîtrise pas.

    En fait, j'ai un problème de syntaxe également, je ne sais pas traiter ma donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                foreach (var i in donnees)
                {
                        if (donnees[i]["impulsions"].ToString() != "0"
                        {
                            label11.Text = "OK";
                        }
                }
    Je pensais essayer un syntaxe comme ça mais celle-ci n'est pas bonne. "Impossible d'appliquer l'indexation à l'aide de [] à une expression de type IQueyable". Voilà si je dois apporter d'autres précisions au niveau de mon erreur, faut pas hésiter à me dire.

    Merci.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    La syntaxe que tu cherches est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach(var donnee in donnees)
      if(donnee.impulsions.ToString() != "0") label.Text = "OK";
    Mais comme si donnees est bien le résultat du Select que tu as montré avant il s'agit bien d'un IQueryable, qui refera la requête sur ta base, dont la connexion est peut-être déjà fermée.

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Je vais tâcher d'éclairer un peu les choses concernant l'exécution différée et l'exécution immédiate afin que tu puisses mieux t'y retrouver et peut-être déjà résoudre certaines difficultés.

    La façon la plus simple de se représenter la différence entre les deux est de l'envisager comme la différence entre une requête et le résultat d'une requête. Certaines méthodes d'extension de LinQ (Select, Where, OrderBy, Take, Skip) retournent un IQueryable, c'est-à-dire le potentiel d'un résultat, mais celui-ci n'est pas encore calculé. D'autres (ToArray, ToList, Count, Max, Aggregate, First, Single) ou bien l'utilisation d'un foreach (qui déclenche un parcours par itération) renvoient un résultat concret et forcent, au moins partiellement, l'exécution de la requête précédente.

    Un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var list = new List { "Elton", "John", "Paul" }; // listons les membres d'un groupe de musique ayant quelque notoriété
     
    var query = list.Select(s => s.ToUpper()); // l'objet retourné par Select est un IQueryable
    var arrayResult = list.Select(s => s.ToUpper()).ToArray(); // l'objet retourné est le résultat de la requête sous forme de tableau
     
    foreach(var s in query) Console.WriteLine(s) // la requête est exécutée et la liste parcourue au fur et à mesure => "ELTON" "JOHN" "PAUL"
    foreach(var s in arrayResult) Console.WriteLine(s) // le tableau est parcouru => "ELTON" "JOHN" "PAUL"
     
    list.Add("Ringo"); // ajoutons le dernier membre
    foreach(var s in query) Console.WriteLine(s) // la requête est ré-exécutée et la liste re-parcourue => "ELTON" "JOHN" "PAUL" "RINGO"
    foreach(var s in arrayResult) Console.WriteLine(s) // c'est toujours le tableau d'origine qui est parcouru => "ELTON" "JOHN" "PAUL"
    Les principale différences se voient en cas d'énumérations multiples et /ou avec effets de bords ou bien d'exécution partielle. Dans le cas d'une énumération partielle un IQueryable peut être intéressant car on attend toujours le dernier moment avant d'effectuer une opération, ce qui permet d'éviter des calculs lorsqu'ils ne sont pas utiles.

    En revanche lors d'énumérations multiples d'une IQueryable tous les calculs et traitements éventuels seront ré-exécutés avec des effets parfois inatendus : par exemple, si la source de données est une connexion vers une base de données, rien ne garanti que la connexion n'aura pas été fermée entre les deux requêtes, entrainant une erreur.

    Dans ton cas tu semble t'arrêter au Select lorsque tu récupères les données de la base, ce qui ne génère pas d'appel immédiat, mais peut en générer plusieurs (et donc solliciter plusieurs fois le réseau) ultérieurement. Tu auras sans doute intérêt à invoquer un ToArray() afin de récupérer immédiatement le résultat e ta requête et ne travailler ensuite qu'avec tes données en mémoire.

Discussions similaires

  1. Récupérer des info dans une page html
    Par DORBRITZ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/03/2008, 11h13
  2. Recherche d'infos dans une bd via textbox
    Par lordgodgiven dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/09/2006, 17h59
  3. Recherche d'info dans une base
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/08/2006, 16h08
  4. Recherche des symboles dans une lib c++
    Par firens dans le forum MFC
    Réponses: 4
    Dernier message: 31/03/2006, 14h56
  5. [MySQL] Chercher des info dans une DB, et les afficher en lien
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/10/2005, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo