Problème d'affiche dans une Boucle Foreach
dylan_garrix
Messages postés
70
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
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 :
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.
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.
A voir également:
- N'affichez que les personnes de calais ayant 20 ans et une note supérieure ou égale à 12. quel mot apparaît dans la colonne code ?
- Code ascii - Guide
- Déplacer une colonne excel - Guide
- Trousseau mot de passe iphone - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Trier une colonne excel - Guide
10 réponses
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.
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.
Bonsoir
et bien ça fait exactement ce que tu as écrit
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
Avant la boucle tu crées une List<T> de cette classe et tu ajoutes une instance à chaque boucle, un truc comme ça:
Et c'est cette liste que tu bindes.
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
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.
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.
l'erreur sa m'affiche là :
le message d'erreur est = message d'erreur " Aucune ligne à la position 0."
je te met tous le code regarde
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();
}
}
}
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
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
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
Tout a l'air en ordre, pourtant en faisant un point d'arrêt sur la ligne

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.
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.
" 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
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
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 ?
"
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 ?
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
ma TextBox regarde dans le code que je t'ai envoyé je l'ai donné le nom de Substring voilà la capture
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.
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.
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.
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.
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
"\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.
https://img-19.ccm2.net/XAQmS7qzwxltQF-ojfVU0lo-_Zk=/7a327d8ad2a548b48395da464446a27b/ccm-ugc/rt.png
sa marche mais sa m'affiche les mêmes resultat regarde
sa marche mais sa m'affiche les mêmes resultat regarde
Pour aider au débogage, peux tu modifier un peu le code
d'une part
et dans la boucle
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});
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
on avance petit a petit regarde maint les ref qui change mais le nom et le code reste toujours celui du premier
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
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
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
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
comme sa !
je sais pas si on a un autre truc a faire mais je veut améliorer encore une autre chose