Concaténer des textes

Résolu
TaharSaid Messages postés 3 Date d'inscription jeudi 2 décembre 2021 Statut Membre Dernière intervention 12 décembre 2021 - Modifié le 1 mars 2022 à 12:27
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 - 22 avril 2022 à 14:37
Bonjour, tout le monde

je veux concaténer tous les textes des contrôles d'un panel et afficher le résultat dans un MessageBox
voici mon code :

  foreach (Control c in panel1.Controls)
  {
        string sep = " ";
        string[] p1 = { c.Text.ToString() };
        string Str = string.Join(sep, p1);
        MessageBox.Show(Str);
  }

mais il ne m'affiche que le texte d'un seul control à la fois et ne les concatène pas
de l'aide SVP et merci à vous !!

6 réponses

Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
2 déc. 2021 à 12:18
Bonjour

Pour poster un code merci de suivre ce petit tuto
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Concernant ton problème, ce que tu as écrit fait ceci
  • tu prends le premier élément de la collection de contrôles
  • tu fais pleins de trucs dessus
  • tu affiches un message
  • tu prends le second élément de la collection de contrôles
  • tu fais pleins de trucs dessus
  • tu affiches un message
  • tu prends le 3me élément de la collection de contrôles
  • tu fais pleins de trucs dessus
  • tu affiches un message
  • etc….


Puisque la démarche ne correspond pas à ton besoin, je m’interroge si tu ne fais pas l’erreur de la majorité des autodidactes (moi aussi en mon temps) à savoir te lancer bille en tête dans ton projet, sans apprendre les bases.
Et bien figure toi ça ne marche pas.
Là tu te retrouves bloqué sur un truc simple, qu’en sera t il quand ça deviendra compliqué?

Je peux te donner une la solution à ton problème mais est ce que ça va vraiment t’aider si tu ne prends pas conscience des lacunes qui t’ont conduit à ce code?

Le meilleur conseil que je puisse te donner est de mettez ton projet de côté quelques jours le temps de suivre un cours en ligne. Celui de Tahé par exemple https://tahe.developpez.com/dotnet/csharp/
A l’issue y’a des chances que tu saches résoudre seul ton problème et si ça n’est pas le cas on pourra s’appuyer sur le socle que tu auras reçu pour te faire comprendre ce qui ne va pas.
0
Bonjour Whismen
Oui c'est vrai ce que tu dis, j'ai appris beaucoup de choses mais en les appliquant c'est une autre chose et merci pour le lien du site de Mr Joachim Tahé .
tu m'as signalé mon erreur et c'est déjà bien et je vais m y mettre et je te tiendrais au courant
Merci
0
vb95 Messages postés 3390 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 27 janvier 2023 163
Modifié le 2 déc. 2021 à 16:52
Bonjour
Non seulement qu'il y a certaines lacunes au niveau de la programmation en C# ( un bonjour à Whismeril en passant ) en plus l'algorithme est complètement faux !
Je te montre le tien en bon français

1) Boucle pour chaque contrôle
2)_____Ma chaine est vide
3)_____Je prends la contenu Text du contrôle
4)_____Je le concatène à ma chaine
5)_____J'affiche le résultat dans MessageBox
6) Fin de boucle

Fais cet exemple à la main avec un crayon et un papier sur 3 contrôles contenant comme texte :
"Bonjour"
" les"
" gars !"
et tu verras ton erreur ( attention les 2 dernières chaines comportent un espace au début ) .
Le résultat devrait être "Bonjour les gars !"
Pour que l'algorithme soit correct il y a 2 lignes à déplacer ( la 2 et la 5 ) mais je ne te dis pas où les mettre !

0
Bonjour vb95
Merci pour le conseil
Quand je le fais je te fais signe
0
TaharSaid Messages postés 3 Date d'inscription jeudi 2 décembre 2021 Statut Membre Dernière intervention 12 décembre 2021
12 déc. 2021 à 14:48
Bonjour tout le monde
J'ai pu résoudre le problème précédent comme ceci :
<gras>List<string> Str01 = new List<string>();
{
foreach (Control c in panel1.Controls)
{
string T= c.Text.ToString();
Str01.Add(T);
}
string sep = " ";
string Str = string.Join(sep,Str01);
MessageBox.Show(Str.ToString());
};

Qu'en pensez-vous ou y a t'il une manière plus subtile ?
Merci pour vos commentaires
0
vb95 Messages postés 3390 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 27 janvier 2023 163
Modifié le 25 avril 2022 à 16:19
Bonjour
Whismeril t'a demandé de suivre un tuto pour déposer un code : chose que tu n'as pas fait ou pas su faire .
Par contre pour ton code il y a mieux
1) Pourquoi déclarer
string T
dans ta boucle
2) Pourquoi déclarer
 string sep = " "
à moins que tu t'en serves ensuite dans la même procédure .
3) Mettre
c.Text.ToString()
est inutile . La propriété Text d'un contrôle est déjà de type string .
4) En renommant Str01 en ListStr on sait ce que cette variable signifie : une liste de String

List<string> ListStr = new List<string>();
foreach (Control c in panel1.Controls)
{
     ListStr.Add(c.Text);
}
MessageBox.Show(string.Join(" ", ListStr);


Et vu que le boucle foreach ne comporte qu'une ligne en interne on peut même supprimer les accolades mais il faut garder l'indentation

List<string> ListStr = new List<string>();
foreach (Control c in panel1.Controls)
     ListStr.Add(c.Text);
MessageBox.Show(string.Join(" ", ListStr);


0
TaharSaid Messages postés 3 Date d'inscription jeudi 2 décembre 2021 Statut Membre Dernière intervention 12 décembre 2021
12 déc. 2021 à 22:40
Merci pour les conseils
Si je suis les cours de Tahé comme l'a suggéré Whismeril et justement en arrivant aux boucles j'ai corrigé pas mal d'erreurs que je commettais .
Je suis nouveau dans la programmation et c'est pour cela que j'essaye d'être beaucoup plus explicite en codant afin de ne pas perdre le fil !
mais ça vient en forgeant.
0
vb95 Messages postés 3390 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 27 janvier 2023 163 > TaharSaid Messages postés 3 Date d'inscription jeudi 2 décembre 2021 Statut Membre Dernière intervention 12 décembre 2021
Modifié le 12 déc. 2021 à 22:48
Bonsoir
Si le sujet vous semble résolu veuillez clôturer celui avec le bouton adéquat !

Bonne continuation dans la programmation
Merci
0

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

Posez votre question
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
12 déc. 2021 à 15:56
Bonjour à vous

@VB
certes TaharSaid n'a pas utilisé la coloration syntaxique dans le message, mais il semble avoir mis à profit le conseil d'apprendre les bases et de revenir à son problème car cette fois l'algorithme écrit correspond à son besoin. Tes remarques sont constructives puisque cela simplifie le code et réduit notablement le temps d'exécution de l'algorithme.

@TaharSaid
On peut encore faire autrement, avec Linq. Le cours de Tahé ne l'aborde pas, c'est pour cela que je te montre et te conseille de t'y pencher, c'est un outil très puissant.

Ecriture 1, dite "spagethi"
var LesTextes = (from c in panel1.Controls
                              select c.Text);
MessageBox.Show(string.Join(" ", LesTextes);

Qui équivaut à
MessageBox.Show(string.Join(" ", (from c in panel1.Controls
                                                               select c.Text));


Ecriture 2, en ligne
MessageBox.Show(string.Join(" ", panel1.Controls.Select(c => c.Text)));


Dans les 2 cas la requête n'est rééllement exécutée qu'au moment du MessageBox. C'est dû à l'exécution différée des requêtes Linq. C'est un des points forts de Linq mais aussi un piège quand on n'y fait pas attention.

Voici un tuto qui fait le tour de cet outils
https://webman.developpez.com/articles/dotnet/introlinqtoobjects/
0
Bonjour,

Quand on itère sur des chaines pour les concaténer celà peut vite être gourmand en temps de traitement et en mémoire, je vous invite à aller voir du coté de la classe 'StringBuilder'.

Ca donne un truc comme çà :

StringBuilder sb = new StringBuilder();

foreach (Control c in panel1.Controls)
sb.Append(c.Text);

return sb.ToString();

Cdt.
0
Whismeril Messages postés 18199 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 janvier 2023 624
22 avril 2022 à 14:37
Ce serait bien que toi aussi tu lises le tuto sur les balises de code!
0
Rejoignez-nous