Problème d'affiche dans une Boucle Foreach

dylan_garrix Messages postés 82 Statut Membre -  
 Utilisateur anonyme -
coucou, j'ai un petit Souçis je vous explique le principe :
Enfaite j'ai un TextBox Multilines " Search " et une Base de donnés d'ou je dois afficher le CodeArticle et le NomArticle grace à leurs ref_art = qui va être saisir dans la TextBox = Search

Mon problème est avec ce Code :
 protected void Button1_Click(object sender, EventArgs e)
        {
            Con.Open();
            
                DataTable dt = new DataTable();
            

            char delimiter = '\n';
            string[] substrings = search.Text.Split(delimiter);
            int i = 0;
            foreach (var substring in substrings)
                // Linq to SQL
                // SqlDataAdapter
                //DataTable
                // SDA.Fill (Data)
                //Set Data or Data Set
            {

                SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
                SDA1.Fill(dt);
                

            }

            GridView1.DataSource = dt;
           
                GridView1.DataBind();
            Con.Close();
        } 


je n'arrive pas a afficher tous les donnés qui sont dans " Search " dans un tableau
sa m'affiche toujours le dernier Réf et quand je supprime sa m'affiche l'avant dernier ect ...

Mon But et d'Entrer plusieurs lignes de Ref_Art dans "Search" ( TextBox ) et qu'il m'affiche leurs codeArticle et leurs NomArticle

Merci Bien de m'aider.

10 réponses

Résumé de la discussion

Le problème consiste à afficher dans un tableau les CodeArticle et NomArticle correspondant à plusieurs Ref_Art saisis dans une TextBox Search multiline, via une requête pour chaque Ref_Art et un affichage dans un GridView. Des éléments de réponse indiquent d'utiliser une seule DataTable dt et d'alimenter dt par SDA1.Fill(dt) dans la boucle, afin d'accumuler les résultats plutôt que d'écraser les données. Le point clé est de traiter correctement les retours à la ligne, en particulier \r\n ou \n, et d'éviter d'utiliser une classe Résultat intermédiaire qui peut tromper le flux de données. En testant avec des références inexistantes et en ajustant la délimitation des lignes (par exemple Environment.NewLine), on obtient une liste complète des résultats sans perte de lignes.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Utilisateur anonyme
     
    Attends on n'a pas finit.

    Si le fait de mettre dt comme datasource règle le problème, ça veut dire que Fill, ajoute chaque requête à dt.
    Ce que j'avais mal interprété au début (le problème venant finalement du \r).

    Donc tu peux supprimer la classe Résultat et toute référence à elle.

    Une fois fait, essaye une requête avec des références qui n'existent pas, pour voir si ça buggue

    Si ça marche on s'occupera de s'affranchir de la configuration de Windows pour le saut de ligne.
    1
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      c'est bon j'ai essaie avec des requetes qui n'exitse pas et sa me sort rien niCkél
      0
    2. Utilisateur anonyme
       
      Ok, alors, pour éviter toute surprise avec la configuration de Windows, remplacement "\r\n" dans le tableau delimiter par Envirronment.NewLine ainsi que ce soit configuré par défaut ou la mode unix (juste un \n) ça marchera.
      0
    3. dylan_garrix Messages postés 82 Statut Membre 2
       
      string[] delimiteur = Envirronment.NewLine ;

      comme sa !
      0
    4. Utilisateur anonyme
       
      Non
      string[] delimiteur = {Envirronment.NewLine};
      0
    5. dylan_garrix Messages postés 82 Statut Membre 2
       
      Oui sa marche nickel Whismerii
      je sais pas si on a un autre truc a faire mais je veut améliorer encore une autre chose
      0
  2. Utilisateur anonyme
     
    Bonsoir

    et bien ça fait exactement ce que tu as écrit
                foreach (var substring in substrings)
                {
                    SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
                    SDA1.Fill(dt);
                    
    
                }


    Au premier passage dans la boucle, ça remplit dt avec le résultat de la recherche de la première référence.
    Au second passage dans la boucle, ça remplit (et donc remplace le contenu existant) dt avec le résultat de la recherche de la 2eme référence.
    ETC.
    Au dernier passage dans la boucle ça remplit (et donc remplace le contenu existant) dt avec le résultat de la recherche de la dernière référence.
    Et enfin, ça affiche dt, avec la dernière référence.

    Il y a plusieurs options, et les base de données n'étant pas pas ma tasse de thé, je ne les détaillerais pas trop.

    Option 1
    Tu écris une classe
    class Resultat
    {
      public string NomArticle {get; set;}
      public string CodeArticle {get; set;}
    }


    Avant la boucle tu crées une List<T> de cette classe et tu ajoutes une instance à chaque boucle, un truc comme ça:

                List<Resultat> res = new List<Resultat>();
                foreach (var substring in substrings)
                {
                    SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork  Where Ref_Art='" + substring + "'", Con);
                    SDA1.Fill(dt);
                    res.Add(new Resultat{NomArticle = dt.Rows[0].Field<string>(0), CodeArticle = dt.Rows[0].Field<string>(1)};//y'a peut être mieux que dt.Rows[0].Field<string>(0) mais comme je te l'ai dit c'est pas mon fort
                }


    Et c'est cette liste que tu bindes.
    GridView1.DataSource = res;


    Option 2
    tu écris une requête avec "Where Ref_Art= Ref1 ou Ref2 ou Ref3, etc....", là pour la syntaxe je ne sais pas trop.

    Option 3
    tu fais une jointure, un exemple avec Linq
                List<Resultat> res = (from DataRow ligne in dt.Rows
                                      join reference in substrings on ligne.Field<string>("Ref_Art") equals reference
                                      select new Resultat
                                      {
                                          CodeArticle = ligne.Field<string>("CODEARTICLE"),
                                          NomArticle = ligne.Field<string>("NOMARTICLE"),
                                      }
    
                                          ).ToList();
    ça se fait aussi en SQL, mais je ne saurais te montrer.

    0
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      ce que j'ai écrit sa n'a pas voulu marché comme j'avais éxpliquer on dirait sa écrase à chaque fois le résultat et affiche Seulement 1 seule a chaque fois que je supprime le suivant !!

      malgrés vous m'avez dit c'est exactement ce que j'ai écrit
      0
    2. dylan_garrix Messages postés 82 Statut Membre 2
       
      avec l'option 1 sa m'affiche sa comme message d'erreur " Aucune ligne à la position 0."
      0
  3. Utilisateur anonyme
     
    ce que j'ai écrit sa n'a pas voulu marché comme j'avais éxpliquer on dirait sa écrase à chaque fois le résultat et affiche Seulement 1 seule a chaque fois que je supprime le suivant !!
    Je me suis mal exprimé, tu vois qu'il faut être le plus précis possible, le code que tu as écrit fait exactement le comportement que tu as expliqué et non celui que tu voudrais.
    Oui ça ecrase, puisque le code le demande.

    Le message d'erreur c'est bien,ajouter à quelle ligne se produit l'erreur et quel est le contenu des variables à ce moment là c'est indispensable.
    0
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      l'erreur sa m'affiche là :
      res.Add(new Resultat { NomArticle = dt.Rows[0].Field <string>(0), CodeArticle = dt.Rows[0].Field <string>(1) });


      le message d'erreur est = message d'erreur " Aucune ligne à la position 0."


      je te met tous le code regarde
      using System;
      using System.Collections.Generic;
      using System.Data;
      using System.Linq;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      using System.Data.SqlClient;

      namespace WebApplication5
      {
      public partial class WebForm1 : System.Web.UI.Page
      {
      SqlConnection Con = new SqlConnection("Data Source=sql01;Initial Catalog=ArticlesFournisseurs;Integrated Security=True");
      protected void Page_Load(object sender, EventArgs e)
      {


      }

      protected void Button1_Click(object sender, EventArgs e)
      {
      Con.Open();

      DataTable dt = new DataTable();


      char delimiter = '\n';
      string[] substrings = search.Text.Split(delimiter);

      List<Resultat> res = new List<Resultat>();

      foreach (var substring in substrings)


      // Linq to SQL
      // SqlDataAdapter
      //DataTable
      // SDA.Fill (Data)
      //Set Data or Data Set
      {

      SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork Where Ref_Art='" + substring + "'", Con);

      res.Add(new Resultat { NomArticle = dt.Rows[0].Field <string>(0), CodeArticle = dt.Rows[0].Field <string>(1) });
      SDA1.Fill(dt);

      }
      GridView1.DataSource = res;
      // GridView1.DataSource = dt;

      GridView1.DataBind();
      Con.Close();
      }
      }
      }
      0
    2. dylan_garrix Messages postés 82 Statut Membre 2
       
      Peut tu me proposer le bon Code " une Solution " stp
      0
    3. Utilisateur anonyme > dylan_garrix Messages postés 82 Statut Membre
       
      A première vue, cela voudrait dire qu'il n'y a rien dans dt.

      Ce qui est logique puisque tu faits le fill après cette ligne.
      0
    4. dylan_garrix Messages postés 82 Statut Membre 2 > Utilisateur anonyme
       
      si sa m'affiche toujours le dernier exemple je met :
      E113916
      734145
      E113915
      88609*
      734146

      sa m'affiche le tableau de "734146 " ensuite je supprime le dernier ce qui donne sa :
      E113916
      734145
      E113915
      88609*
      sa m'affiche le tableau de "88609* " !!

      ainsi de Suite !

      et ce que je veut c'est en mettant tous ses donnant :
      sa m'affiche tous ensemble dans un Seule tableau
      0
    5. Utilisateur anonyme > dylan_garrix Messages postés 82 Statut Membre
       
      Pour ton message de 13:15, de quel code parles tu, puisque celui de 12:57 plante, il ne devrait rien afficher.
      0
  4. Utilisateur anonyme
     
    Non, tu ne m'as pas une seule fois fourni l'information dont j'ai besoin.
    Je ne sais pas si tu crois que je te prends pour un idiot (ça n'est pas le cas) et que du coup tu ne veux, ou alors si tu ne comprends ce que je te demande, ou si tu est tellement sûr de toi que tu ne veux même pas vérifier ce p**** de contenu, ou je ne sais quelle autre raison.
    Du coup, maintenant que j'ai visual studio sous la main, je peux te montrer, un truc qui peut très bien se produire chez toi et qui serait une bonne raison de bugguer.

    Avec ce code
     char delimiter = '\n';
                string[] substrings = @"E113916 
    734145 
    E113915 
    88609* 
    734146".Split(delimiter);
                
                foreach (var substring in substrings)
                // Linq to SQL
                // SqlDataAdapter
                //DataTable
                // SDA.Fill (Data)
                //Set Data or Data Set
                {
    
                    SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT Ref_Art,NOMARTICLE,CODEARTICLE from woork", Con);
                    SDA1.Fill(dt);
    
                }
    

    Tout a l'air en ordre, pourtant en faisant un point d'arrêt sur la ligne
    SDA1.Fill(dt);



    On constate que substring ne vaut pas "E113916" et que du coup la recherche ne peut pas aboutir.
    Donc forcément, quand ensuite on demande de lire le 1er résultat de la recherche, ben y en a pas.

    Donc tant que tu ne m'auras pas dit si chez toi c'est bien "734145", "E113915", "88609*" et "734146", on ne pourra pas avancer.

    0
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      " Donc tant que tu ne m'auras pas dit si chez toi c'est bien "734145", "E113915", "88609*" et "734146", on ne pourra pas avancer. "


      tu parle dans ma Base oui je t'avais dis elle existe puisque toute Seule sa marche

      et si dans la TextBox oui c'est Bien sa !!

      sinon que veut tu dire si chez moi c'est bien "734145", "E113915", "88609*" et "734146",
      je t'ai répondu comme j'avais compris le question
      0
    2. dylan_garrix Messages postés 82 Statut Membre 2
       
      quand je met le point d'arret sur cette ligne moi sa m'affiche pour substrings toute les refs que j'ai entre et pour Substring = NULL c'est normal !
      0
    3. Utilisateur anonyme
       
      Substring = NULL c'est normal

      Ha non ça n'est pas normal, soit tu n'as pas mis le point d'arrêt comme sur ma capture d'écran, soit le problème vient de là.
      0
    4. dylan_garrix Messages postés 82 Statut Membre 2
       
      Bonjour, euh je viens de mettre le point de l'execution sur le
      "
      SqlDataAdapter SDA1 = new SqlDataAdapter("SELECT NOMARTICLE,CODEARTICLE from woork Where Ref_Art= '" + substring + "'", Con);"

      il me sors la première valeurs !


      oui talleur c'est normal parce que j'ai pas encore fais l'execution

      donc Voilà il me sors la premiere valeur pas comme toi ! c'est Bizarre non ?
      0
    5. Utilisateur anonyme
       
      Bizarre pas forcément, ça veut dire que ton Windows a une configuration particulière.
      La conf par défaut est que la fin de ligne est signifiée pas "\r\n" donc en splitant juste avec "\n" on se retrouve avec "\r" à la fin des lignes intermédiaires et pas la dernière.
      Et du coup si 734145 existe 734145\r non.
      C'est ce que je t'ai montré avec ma capture.

      Donc à priori, le problème n'est pas là.

      Peux tu me donner le contenu de de ton texbox, pas ce que tu as tapé, mais bien ce qui apparaît dans l'espion flottant (comme sur ma capture) pour connaître les éventuels caractères invisibles.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    Sans deconner!
    Y'a un \r à la fin de chacune de tes lignes!
    Si tu m'avais montré ça hier à midi, ton problème serait réglé depuis longtemps.

    Dans un premier temps, teste en splittant sur "\r\n" et si ça marche, on rendra ton code robuste à l'erreur de saisie et à la configuration inhabituelle de Windows.
    0
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      montre moi Doucement parceque j'ai rien compris !
      je suis pas un pro je viens de commencer avec le C# le \r je sais pas d'ou il apparait mais bon je le vois biens dans la capture que je t'ai envoyé
      que Dois-je faire exactement et j'espère que sa va marcher
      0
  7. Utilisateur anonyme
     
    Je répète
    Dans un premier temps, teste en splittant sur "\r\n" et si ça marche, on rendra ton code robuste à l'erreur de saisie et à la configuration inhabituelle de Windows.
    0
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      peut tu me donner la Syntaxe S'il vous plait j'ai pas réussi !
      char [] delimiter = '\r\n' ; erreur
      char [] delimiter = "\r\n" ; erreur
      char delimiter = \r\n' ; erreur
      char delimiter = "\r\n"; erreur !


      merci de m'aider a Spliter
      0
      1. Utilisateur anonyme > dylan_garrix Messages postés 82 Statut Membre
         
        char définit un caractère unique, a, A, b - 1 ! \r.
        "\r\n" contient "plusieurs" caractères, c'est donc une chaine de caractères : string (note qu'une chaine de caractères commence à 0 caractères).

        Dans les différentes surcharges de la méthode split (il y a eu quelques changements au fil des Frameworks), il en existe ou tu peux entrer un tableau de string en délimiteur.

        Pour .Net 4.51, la surcharge la plus simple, nécessite un paramètre d'option

        string[] delimiteur = {"\r\n"};
        string[] lignes = montexte.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);//cette option à l'avantage de virer les lignes vides.
        
        0
    2. dylan_garrix Messages postés 82 Statut Membre 2
       
      sa marche Bien je t'ai envoyé une capture d'écran sauf que il me répète le premier seulement 5 fois le nombre de ligne dans la TexTBOX
      0
  8. dylan_garrix Messages postés 82 Statut Membre 2
     
    0
    1. Utilisateur anonyme
       
      Et en entrée tu as quoi?
      0
      1. Utilisateur anonyme > Utilisateur anonyme
         
        Pour aider au débogage, peux tu modifier un peu le code

        d'une part
        class Resultat
        {
          public string RefArticle {get; set;}
          public string NomArticle {get; set;}
          public string CodeArticle {get; set;}
        }


        et dans la boucle
        res.Add(new Resultat{NomArticle = dt.Rows[0].Field<string>(0), CodeArticle = dt.Rows[0].Field<string>(1), RefArticle = substring});
        0
  9. dylan_garrix Messages postés 82 Statut Membre 2
     
    https://img-19.ccm2.net/JZIWeSc2Rpev6tZ6w_k3TP-prR4=/2ccba18adbb74dfc8a830a2241d50cd0/ccm-ugc/yo.png

    on avance petit a petit regarde maint les ref qui change mais le nom et le code reste toujours celui du premier
    0
    1. dylan_garrix Messages postés 82 Statut Membre 2
       
      c'est bon je viens de le régler enfaite fallais faire le
      GridView1.DataSource = DT;
      et non GridView1.DataSource = res;


      c'est bon sa marche merci beaucoup !

      euh apart sa autre question ! as-tu un Bon site Web qui apprend le C# ASP.NET et les requetes avec les DATATABLE , DATASET , Gridview les trucs comme cela ? svp
      0
    2. dylan_garrix Messages postés 82 Statut Membre 2
       
      et Si je veut faire une condition Sur une ligne si elle existe vraiment pas dans ma base ou pas sinon je l'affiche dans un autre tableau de non existant !

      exemple :
      893.316PB
      153380
      734144
      smldpsd ==> celui la n'existe pas "
      153140

      comment faire pour faire un genre de if () et l'afficher dans une nouvelle table
      0