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 :

C# Récupérer les informations dans un DataTable ou un DataGridView


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 22
    Points : 16
    Points
    16
    Par défaut C# Récupérer les informations dans un DataTable ou un DataGridView
    Bonjour, je développe un programme pour un serveur et je bloque à un endroit, voilà le soucis :
    Donc dans mon logiciel, cette fonction permet de récupérer des informations telles que le temps de connexion total et d'autres informations sur un membre du Staff sur une période choisie.

    Alors pour le moment j'arrive à sélectionner la période voulue, et à avoir l'identifiant du staff, le soucis est le suivant :

    J'aimerai pouvoir dans mon datagridview, sélectionner toutes les lignes correspondant à l'indentifiant du staff et dont la date correspond à la période choisie :

    Voici quelques screens de mon logiciel :
    http://prntscr.com/jflgnl
    Sur cette partie, on sélectionne la période(7j max) puis dans le datagridview on va faire click droit sur le steam id du staff choisi et cliquer sur affichier le résumé sur la période.

    http://prntscr.com/jflh9d
    Ici on a le datagrid principal, donc une fois que la période est choisie et que la personne va cliquer pour résumer, je voudrai sélectionner et garder seulement les lignes correspondantes au steam ID et qui contiennent la date donc par exemple :

    Je sélectionne ma période de 4 jours du 6 au 9 mai 2018
    Je sélectionne le Steam ID voulu et je clique sur résumé
    Une fois cliqué, dans mon dataGridView1 qui comprends steamid, nom, date de connexion, déconnexion, temps de jeu et total de claims, le logiciel garde uniquement les lignes qui contiennent : Le Steam ID, et dont la date de connexion contient 06/05/2018, 07/05/2018, 08/05/2018 et 09/05/2018

    Je tiens à préciser que de base, je récupère ses données sur une page html et je les transcrits dans un datatable appellé dtData puis je le mets en DataSource pour mon dataGridView1.

    Donc du coup j'aimerai qu'au lieu de vider le gridview1, il sélectionne juste les valeurs voulues et les transmettent dans un dataGridView3.

    J'espère avoir été assez précis car j'ai un peu de mal à m'expliquer par rapport à ça, si vous avez besoin de plus de détails ou de précision je donnerai tout ce qu'il faut

    J'ai essayé ce code mais il me renvoie le numéro de la ligne contenant une nouvelle fois le Steam ID, c'est déjà cool mais j'ai toujours pas trouvé comment faire pour avoir la date + le steam id :/
    De plus, dés qu'il ne trouve plus de cellules correspondants, le logiciel crash car "System.NullReferenceException*: 'La référence d'objet n'est pas définie à une instance d'un objet.' System.Windows.Forms.DataGridViewCell.Value.get retournée null."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
                int index = dataGridView1.CurrentRow.Index;
                string someString = dataGridView1[0, index].Value.ToString(); //steamid
     
                int index2 = dataGridView1.CurrentRow.Index;
                string someString2 = dataGridView1[3, index].Value.ToString();
                string output = someString2.Split('-').Last();
                string result = output.Replace(" ", ""); // date
     
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells[0].Value.ToString().Contains(someString))
                    {
                       MessageBox.Show(System.Convert.ToString(row));
                    }
     
                }

  2. #2
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Utilise une DataView, filtre la avec un RowFilter, et utilise cette DataView filtrée comme DataSource de ta DataGridView.

    Regarde ici et ici et bien entendu la doc officielle ici.
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour, merci de ta réponse, pour ce qui est du doc officiel..
    https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
    J'ai pas vraiment compris comment m'en servir, c'est la toute première fois que j'utilise tout ce qui touche aux datagridviews datatables etc et j'ai du mal à comprendre comment utiliser tout ça...

    J'ai réussi à faire en sorte de récupérer la ligne qui correspond à la fois au steam ID et à la date, par contre quand je la transférais il récupérait l'index - 1, pour le corriger j'ai fais row.Index +1.

    Voici en vert les lignes qui devraient êtres sélectionnées lors du test : http://prntscr.com/jfryiy
    Quand d'ailleurs je teste avec une messagebox de récupérer l'index, j'ai les bons numéros c'est à dire : 2 3 5 et 9
    Mais quand j'utilise le code pour copier ces lignes dans un autre DataGridView, il me récupère ces lignes là : http://prntscr.com/jfrz6a

    Donc en faisant rox.Index + 1 cela marche correctement.

    Par contre j'en viens à un nouveau problème, je n'arrive pas à faire en sorte de récupérer les valeurs par exemple nombre de pizza, de chaque ligne pour les ajouter entre elles.

    Exemple : j'ai 4 ligne pour le joueur test1, et dans ces 4 lignes il y aura 13 18 95 12 pour le nombre à additionner, j'aimerai pouvoir détecter qu'il y ait 4 lignes et additionner ces 4 valeurs, par contre, si il y a pour le joueur test2 18 lignes, j'aimerai qu'elles soient détectées également donc éviter un if(rows.Count = blabla) qui se prolongerait à l'infini :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
                foreach(DataGridViewRow total in dataGridView3.Rows)
                {
                    if(resultclaim == 0)
                    {
                        indexnum = dataGridView3.CurrentRow.Index;
                        resultclaim = Convert.ToInt32(dataGridView1[5, index].Value); // 5 = le numéro de la colonne pour le nombre que je veut additionner
                    }
                    else
                    {
                        indexnum = dataGridView3.CurrentRow.Index;
                        resultclaim = resultclaim + Convert.ToInt32(dataGridView1[5, index].Value); // 5 = le numéro de la colonne pour le nombre que je veut additionner
                    }
                }
                MessageBox.Show("Total : " + resultclaim.ToString());
    Ce code ne marche absolument pas, il me donne un nombre qui n'a rien à avoir avec le résultat, même si j'additionne que les 2/3/4... premières lignes le résultat que j'ai ne tombe jamais :/

  4. #4
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    J'ai pas vraiment compris comment m'en servir, c'est la toute première fois que j'utilise tout ce qui touche aux datagridviews datatables etc et j'ai du mal à comprendre comment utiliser tout ça...
    Tu as déjà ta datatable dtData, donc tu peux facilement créer une dataview et filtrer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DataView dtview = new DataView(dtData);
    string query = "StreamID = le_stream_id_a_filtrer AND  Date IN (#12/31/2008#, #1/1/2009#)";  // dates a remplacer bien sur par tes dates
    dtview.RowFilter(query);
    dataGridView.DataSource = dtview;
    donc éviter un if(rows.Count = blabla) qui se prolongerait à l'infini :/
    A juste titre!
    Il faut que tu gardes en tête que la DataGridView ne doit servir qu'a l’affichage de tes données. Tu ne veux donc pas récupérer des lignes, des colonnes et des cellules. Ce qu'il te faut, c'est manipuler les données SOUS la datagridview. En l’occurrence, ta table dtData.

    Cela dit, je ne suis pas familier des DataTable. J'utilise principalement des List<>... Dans ton cas, comme tu connais la structure des tes objets "connection_info", pourquoi ne pas utiliser des List<>, qui sont des objets très faciles a manipuler? Il suffit de creer une classe qui contiendra tes infos, et le tour est joue.
    cela permet de faire des requêtes du genre int totalclaims = connections.Where(p => p.steamid == "bbb").Sum(p => p.claims);
    (oui, je sais ça ne répond pas a ta question, mais les List et autre IEnumerable sont quand meme super utiles!)


    Un exemple de classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            private class InfoConnexion
            {
                [DisplayName("Steam ID")]
                public string steamid { get; set; }
                [DisplayName("Nom")]
                public string nom { get; set; }
                [DisplayName("Connexion")]
                public DateTime connexion { get; set; }
                [DisplayName("Deconnexion")]
                public DateTime deconnexion { get; set; }
                [DisplayName("Temps de jeu")]
                public TimeSpan temps_de_jeu { get { return (deconnexion - connexion); } }
                [DisplayName("Claims")]
                public int claims { get; set; }
            }
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    je n'ai pas du tout de connexion strings, en fait c'est un lien qui est déjà un tableau, c'est pour ça que j'utilise la datatable, car c'est un tableau de données, et pour être franc je n'ai jamais utilisé les Listes, on me dit souvent que c'est plus pratique mais j'arrive pas à comprendre comment faire pour avoir l'équivalent d'un tableau en liste, car j'ai un tableau avec plus de 1000 lignes qui elles ont 6 colonnes, du coup je me disait qu'en liste ça consommerait bien plus.

    Car oui le logiciel que je fait doit servir à remplacer internet pour les joueurs et staffs qui peuvent pas lancer à la fois un navigateur et le jeu ou sinon > crash.
    Donc si je fais une liste aussi longue qui est actualisée en permanence ça reviendrai à consommer énormément contrairement à une datatable que l'on actualise manuellement non ?

    En fait si tu veux c'est un tableau déjà mis en place, je n'ai pas accès au logs du serveur avec des identifiants car ça seul le Fondateur y a accès, il nous a mis un tableau qui récupère automatiquement ces informations du serveur en accès libre mais c'est juste un page html ayant un tableau, pas d'identifiants à avoir mais rien que je récupère de moi même venant du serveur :/

    J'ai corrigé les quelques soucis que j'ai eu au niveau des espaces etc ce qui donne ceci :
    Néanmoins, les lignes retournées sont vides, par contre il détecte bien que j'ai exemple 5 lignes qui correspondent :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
                if (dtData2.Columns.Contains("Steam ID") || dtData2.Columns.Contains("Nom du Staff") || dtData2.Columns.Contains("Date de Connexion") || dtData2.Columns.Contains("Date de Déconnexion") || dtData2.Columns.Contains("Temps de jeu") || dtData2.Columns.Contains("Nombre de Claims"))
                {
     
                }
                else
                {
                    dtData2.Columns.Add("Steam ID");
                    dtData2.Columns.Add("Nom du Staff");
                    dtData2.Columns.Add("Date de Connexion");
                    dtData2.Columns.Add("Date de Déconnexion");
                    dtData2.Columns.Add("Temps de jeu");
                    dtData2.Columns.Add("Nombre de Claims");
     
                }
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells[0].Value == null || (row.Cells[0].Value.ToString().Trim() == ""))
                    {
     
                    }
                    else
                    {
                        if (row.Cells[0].Value.ToString().Contains(someString))
                        {
                            if (row.Cells[2].Value == null || (row.Cells[2].Value.ToString().Trim() == ""))
                            {
     
                            }
                            else
                            {
                                if (row.Cells[2].Value.ToString().Contains(result))
                                {
     
                                    MessageBox.Show(System.Convert.ToString(row.Index));
                                    dt1.ImportRow(dtData.Rows[row.Index + 1]);
     
     
     
     
     
                                    //string query = "SteamID = '"+ row.Cells[0].Value+ "' AND  Date de Connexion IN (#" + row.Cells[2] + "#";  // dates a remplacer bien sur par tes dates
     
                                    string query2 = "[Steam ID] = '" + row.Cells[0].Value + "' AND  [Date de Connexion] Like ('%" + result + "%')";
                                    string query = string.Format("[Steam ID] = '{0}' AND [Date de Connexion] = '{1}'", row.Cells[0].Value, row.Cells[2].Value);
     
                                    dtview.RowFilter = query2;
                                    MessageBox.Show(System.Convert.ToString(dtview));
                                    dtData2.Rows.Add(dtview.ToTable());
                                    //dtData2 = dtview.ToTable();
                                    dtData2.AcceptChanges();
     
                                }
                            }
                        }
                    }
                    dataGridView3.DataSource = dtData2;
     
                }

  6. #6
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Pour ce qui est du code, c'est normal que tu ne récupères qu'une seule ligne, puisque tu ne cherches qu'une id et une seule date.

    Pour revenir sur l'utilisation des listes, en réalité, les listes sont plus légères en mémoires et en temps processeur (par exemple ici et ici ). Et surtout, plus facile a manipuler!

    En général, l'utilisation de List<T> est plus pratiques surtout si tu connais déjà la structure des données et leur type, comme ce qui semble être ton cas.

    En outre, si tu peux contacter le Fondateur (j'aime bien ça, ça me fait penser à l'Architecte de Matrix...), vois avec lui si au lieu d'un tableau html, il ne peut pas produire un json ou un xml, que tu deserialise en une classe. Si il peut produire un tableau, il peut produire un XML!
    Regarde les fichiers joints, un exemple XML, la classe InfoConnexion.

    Avec un bout de code aussi simple que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                XmlSerializer serializer = new XmlSerializer(typeof(List<InfoConnexion>), new XmlRootAttribute("InfoConnexions"));
                using (FileStream stream = File.OpenRead(@"xmltest.xml"))
                {
                    infoconnexions = (List<InfoConnexion>)serializer.Deserialize(stream);
                }
                dataGridView1.DataSource = infoconnexions;
    (avec infoconnexions qui est une variable globale de type List<InfoConnexion>)
    ta datagridview est chargée, et tu as une liste facile a manipuler.

    Pour info, sur mon PC, c'est chargé en 31 ms, pour une mémoire consommée (liste remplie et datasource assignée) de 197KB.
    Fichiers attachés Fichiers attachés
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    D'accord alors pour le tableau etc c'est un système automatique, qui ajoute directement chaque connexion et déconnexion en temps réel, du coup pas possible à faire/trop long pour lui du coup je vais essayer de forcer pour l'avoir mais pas sur :/

    Du coup à base de DataView et DataTables + DataGridView, comment faire pour récupérer toutes les lignes ayant pour steam ID le bon steam id et la bonne date puis les afficher dans mon dataGridView3 ? :/

    Car là je récupère bien qu'il y a par exemple 5 lignes qui correspondent, mais si je fais dataGridView3.Rows.Add(dtview.ToTable());
    Bah j'ai 5 lignes vides :/

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour suite à mes messages que je trouve plutôt mal rédigés j'ai décidé de refaire un post plus propre :
    https://www.developpez.net/forums/ne...ewthread&f=484

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/11/2015, 15h22
  2. Réponses: 0
    Dernier message: 08/11/2011, 13h58
  3. [XSD] Récupérer les informations dans un fichier xsd (xml schema)
    Par gold_men84 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 04/03/2011, 18h50
  4. Récupérer les informations dans un Array
    Par ozlem dans le forum Langage
    Réponses: 20
    Dernier message: 01/04/2010, 12h07
  5. Récupérer les informations dans un tableau
    Par schats dans le forum Langage
    Réponses: 12
    Dernier message: 21/11/2008, 19h19

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