Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trouver une valeur dans un datatable

Sujet résolu
    27 février 2021 à 21:10:09

    Bonjour, je suis actuellement en train d'essayer de trouver une valeur en fonction de deux paramètres mais je bloque un peu..

    Voici comment cela devrait fonctionner :
    On a un numericupdown pour indiquer un niveau et une checkbox pour changer une valeur entre 0 (BFree) et 1 (BPremium) pour calculer un total d'item obtenus sur un jeu.
    En fonction du niveau donné et de la valeur retournée on aura donc un nombre d'item différent
    Exemple, au niveau 26, on en a 3 si la valeur est à 0 et 4 si la valeur est à 1.

    J'ai donc un datatable avec 3 colonnes, Level, BFree et BPremium et toutes ces valeurs ajoutées au Load :

                season1.Rows.Add(2, 1, 1);
                season1.Rows.Add(12, 2, 2);
                season1.Rows.Add(25, 3, 3);
                season1.Rows.Add(26, 3, 4);
                season1.Rows.Add(34, 4, 5);
                season1.Rows.Add(43, 4, 6);
                season1.Rows.Add(46, 5, 7);
                season1.Rows.Add(53, 5, 8);
                season1.Rows.Add(73, 5, 9);
                season1.Rows.Add(83, 5, 10);
                season1.Rows.Add(86, 5, 11);

    Donc dans la colonne 1 c'est bien en fonction du niveau, et, si la checkbox est non cochée c'est la première valeur sinon c'est la deuxième.

    Mon problème est le suivant : Comment faire pour trouver la valeur correspondante selon si la checkbox est cochée ou non, sachant que là il y a uniquement les niveaux 2, 12, 25, 26, 32, 43, 46, 53, 73, 83, 86 et 93 mais que par exemple si le niveau donnée est 88 et la checkbox cochée la valeur sera toujours 11 juqu'au niveau 93.

    J'ai fait cette fonction pour faire une seule et même fonction peu importe la saison pour utiliser donc bplevel qui correspond au niveau et bpbought en fonction du 0/1 :

    private void calculbattlepass(int season, decimal bplevel, bool bpbought)
    {
    //en fonction de BPLevel et bpbought trouver dans la datatable la valeur correspondante, si aucune valeur correspond à bplevel alors on cherche la plus proche en dessous
    }

    Mon ancien code était celui ci (les valeurs sont différentes car il s'agit d'une autre saison) et j'aimerais justement reproduire ça en passant par la fonction calculbattlepass histoire d'éviter les centaines de lignes comme ici puisque je devrais en faire 8 + en rajouter 1 tout les 3 mois :

    private void numericUpDown2_ValueChanged(object sender, EventArgs e)
            {
                if (checkBox2.Checked == true)
                {
                    calculbps8(numericUpDown2.Value, true);
                }
                else if (checkBox2.Checked == false)
                {
                    calculbps8(numericUpDown2.Value, false);
                }
            }
     
            private void calculbps8(decimal bplevel, bool bpbought)
            {
               if(bpbought == true) //bp acheté
               {
                    if (bplevel >= 2 && bplevel <= 4)
                    {
                        bp8packs = 1;
                    }
                    else if (bplevel >= 5 && bplevel <= 12)
                    {
                        bp8packs = 3;
                    }
                    else if (bplevel >= 13 && bplevel <= 20)
                    {
                        bp8packs = 4;
                    }
                    else if (bplevel >= 21 && bplevel <= 28)
                    {
                        bp8packs = 5;
                    }
                    else if (bplevel >= 29 && bplevel <= 31)
                    {
                        bp8packs = 6;
                    }
                    else if (bplevel >= 32 && bplevel <= 36)
                    {
                        bp8packs = 7;
                    }
                    else if (bplevel >= 37 && bplevel <= 38)
                    {
                        bp8packs = 8;
                    }
                    else if (bplevel >= 39 && bplevel <= 44)
                    {
                        bp8packs = 9;
                    }
                    else if (bplevel >= 45 && bplevel <= 60)
                    {
                        bp8packs = 10;
                    }
                    else if (bplevel >= 61 && bplevel <= 68)
                    {
                        bp8packs = 11;
                    }
                    else if (bplevel >= 69 && bplevel <= 96)
                    {
                        bp8packs = 12;
                    }
                    else if (bplevel == 97)
                    {
                        bp8packs = 13;
                    }
                    else if (bplevel >= 98)
                    {
                        bp8packs = 14;
                    }
     
                }
                else if(bpbought == false) //bp gratuit
               {
                    if (bplevel >= 5 && bplevel <= 12)
                    {
                        bp8packs = 1;
                    }
                    else if (bplevel >= 13 && bplevel <= 20)
                    {
                        bp8packs = 2;
                    }
                    else if (bplevel >= 21 && bplevel <= 28)
                    {
                        bp8packs = 3;
                    }
                    else if (bplevel >= 29 && bplevel <= 36)
                    {
                        bp8packs = 4;
                    }
                    else if (bplevel >= 37 && bplevel <= 44)
                    {
                        bp8packs = 5;
                    }
                    else if (bplevel >= 45 && bplevel <= 60)
                    {
                        bp8packs = 6;
                    }
                    else if (bplevel >= 61)
                    {
                        bp8packs = 7;
                    }
                }
                label4.Text = "S8 Battle Pass [" + bp8packs + "]";
            }





    • Partager sur Facebook
    • Partager sur Twitter
      1 mars 2021 à 1:03:22

       Voilà ce que me donne Google avec les mots clés suivants :

      vb.net linq query in datatable

      https://stackoverflow.com/questions/37350998/vb-net-linq-query-on-datatable-where-id-0

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        1 mars 2021 à 21:16:20

        Bonjour, de ce que j'ai pu comprendre sur le post que vous m'avez envoyé, le problème de cette personne n'a rien à voir avec ce que je cherche à faire, de plus, il s'agit de VB.Net et non de C#..

        Là il liste des informations provenantes d'une datatable dans une combobox et les données stockés dans la combobox dépendent de l'id de celle-ci si j'ai bien compris, si c'est bien le cas, je vois pas vraiment en quoi cela peut m'aider étant donné que je cherche à récupérer une information dans une datatable en fonction de deux paramètres qui sont un bool et le nombre le plus proche en dessous de celui donné par l'utilisateur dans le numericupdown.

        • Partager sur Facebook
        • Partager sur Twitter
          1 mars 2021 à 21:56:33

          VB.NET et C#, c'est bonnet blanc et blanc bonnet.

          Vous n'avez pas prêté attention aux mots clés de ma recherche. ;)

          J'ai pris celui-ci car il montrait l'utilisation de LINQ sur une DataTable ainsi que la flexibilité de la chose.

          Donc un truc ressemblant à ça devrait faire le taf :

          tuple = season1.Where(t => t.first <= bplevel).OrderByDescending(t => t.first).First();
          res = bpbought ? tuple.third : tuple.second;



          -
          Edité par bacelar 1 mars 2021 à 22:03:26

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            1 mars 2021 à 22:05:36

            Bonjour, concernant VB.net oui j'ai effectivement pu voir que c'était relativement semblable au c# en quelque peu simplifié cependant je n'ai jamais utilisé ni Linq ni Datatable auparavent d'ou le "débutant", j'ai utilisé des bases de données il y a quelques années mais ça m'a l'air bien différent du datatable et je suis un peu perdu, surtout que j'aimerais que ça reste local donc une base de donnée ne ferait pas l'affaire.

            "Donc un truc ressemblant à ça devrait faire le taf :" je crois que votre exemple n'a pas été publié ?

            • Partager sur Facebook
            • Partager sur Twitter
              1 mars 2021 à 22:07:56

              Miss Click:-°

              Et vraiment fait à l'arrache, juste pour le principe.

              -
              Edité par bacelar 1 mars 2021 à 22:09:05

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                1 mars 2021 à 23:06:48

                Pas de soucis, je vois tout ça dés que possible je vous tiens au courant, je pense avoir saisi comment le bout de code fonctionne, merci beaucoup pour votre aide en tout cas !

                Edit à cause des 24H avant repost : Alors je viens d'essayer et j'ai un plusieurs soucis, la datatable ne contient aucune définition pour Where, donc

                season1.Where(t => t.fi

                ne fonctionne pas, j'ai modifié comme ceci :
                season1.AsEnumerable().Where
                pour finalement que ça donne ça :
                 tuple = season1.AsEnumerable().Where(t => t.Field<decimal>("Level") <= numericUpDown13.Value).OrderByDescending(t => t.Field<decimal>("Level")).First();
                            res = bps8bought ? tuple.third : tuple.second;

                car t.first ne marche pas, le soucis est donc avec tuple.third et tuple.second qui n'esistent pas, même en remplaçant par
                t.Field<decimal>("BFree")

                -
                Edité par RomualdGarcia1 2 mars 2021 à 0:00:03

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mars 2021 à 0:33:33

                  "tuple.third et tuple.second", c'était juste pour l'idée.

                  Vous avez un DataRow dans "tuple", ou un truc approchant (IQuery....), vous devriez arriver à récupérer les valeurs des 2ème et 3ème colonnes de votre DataRow sans trop de problème? Non ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    2 mars 2021 à 1:07:46

                    et bien hormis si tuple ne devait pas être défini comme object, je n'ai rien me permettant de récupérer les colonnes, il y a probablement un moyen si vous le dites mais je connais pas vraiment ce système de datatables.

                    https://prnt.sc/10auemh

                    EDIT :

                    finalement j'ai réalisé mon erreur, il fallait des var et non des objects

                     var tuple = season1.AsEnumerable().Where(t => t.Field<decimal>("Level") <= numericUpDown13.Value).OrderByDescending(t => t.Field<decimal>("Level")).First();
                               var res = bps8bought ? tuple.Field<decimal>("BPremium") : tuple.Field<decimal>("BFree");
                    
                                MessageBox.Show(res.ToString());
                    comme ceci il semblerait que cela me donne le bon résultat, merci beaucoup !

                    -
                    Edité par RomualdGarcia1 2 mars 2021 à 2:00:43

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 mars 2021 à 10:54:19

                      Oups, désolé pour le détail du "var", oui, c'est la bonne manière.

                      Et merci pour ce retour.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                      Trouver une valeur dans un datatable

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown