Problème d'affiche dans une Boucle Foreach

Fermé
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 - Modifié le 20 juil. 2017 à 09:59
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 - 25 juil. 2017 à 09:52
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

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 12:05
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 13:22
c'est bon j'ai essaie avec des requetes qui n'exitse pas et sa me sort rien niCkél
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 13:31
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 13:37
string[] delimiteur = Envirronment.NewLine ;

comme sa !
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 16:02
Non
string[] delimiteur = {Envirronment.NewLine};
0
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
24 juil. 2017 à 08:29
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
19 juil. 2017 à 19:02
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
20 juil. 2017 à 08:23
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
20 juil. 2017 à 08:37
avec l'option 1 sa m'affiche sa comme message d'erreur " Aucune ligne à la position 0."
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
20 juil. 2017 à 12:07
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
20 juil. 2017 à 12:57
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
20 juil. 2017 à 13:01
Peut tu me proposer le bon Code " une Solution " stp
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928 > dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018
20 juil. 2017 à 13:07
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
20 juil. 2017 à 13:15
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928 > dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018
20 juil. 2017 à 13:24
Pour ton message de 13:15, de quel code parles tu, puisque celui de 12:57 plante, il ne devrait rien afficher.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
20 juil. 2017 à 18:04
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 08:29
" 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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 08:34
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 08:51
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 08:59
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 09:24
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 09:10
0
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 09:38
https://img-19.ccm2.net/nyKlp2xfD7oJFTg6z7z_YeJHCao=/73f3d69f47a84fa28745ea6337b212af/ccm-ugc/substring_textbox.jpg

ma TextBox regarde dans le code que je t'ai envoyé je l'ai donné le nom de Substring voilà la capture
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 10:18
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 10:21
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 10:30
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 10:37
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
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928 > dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018
21 juil. 2017 à 11:10
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 11:29
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 11:19
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
21 juil. 2017 à 11:31
Et en entrée tu as quoi?
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
Modifié le 21 juil. 2017 à 11:34
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 11:42
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 11:58
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
dylan_garrix Messages postés 64 Date d'inscription mardi 21 juillet 2015 Statut Membre Dernière intervention 2 février 2018 2
21 juil. 2017 à 12:01
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