Récupération textbox sur une seule ligne

Résolu
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018 - 26 sept. 2018 à 10:40
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 26 oct. 2018 à 22:37
Bonjour,

Je suis débutante en programmation et j'ai un problème pour récupérer un textBox dans un fichier text.

Je m'explique, j'arrive a écrire mon textbox dans mon fichier texte, le problème s'est qu'il me fait une ligne par caractère, au lieu de m'écrire tout les caractères sur la même ligne.

Voici ce que mon programme dit :

string text = MyTextBox.Text + Environment.NewLine;
File.AppendAllText(Path.Combine(@"\\MonSRV\"test.txt"), text);

Voici le résultat obtenu :
3
32
326
3268
32688
326884
3268840
32688400
326884000
3268840001
32688400010
326884000100
3268840001008
3268840001008

Ce que moi, j'aimerais :
3268840001008

Merci pour votre aide

14 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 sept. 2018 à 11:47
Bonjour.

Difficile de t'aider avec aussi peu de code posté...
Il va falloir que postes le code qui permet de remplir la TextBox.
De plus, je ne reconnais pas le langage utilisé, es-tu sur que c'est du C++ ? Si oui, quel framework (Qt, Gtk, autre ?) ?

A première vue, je dirais que tu boucles et append, au lieu de tout mettre dans un string que tu mettrais directement dans la TextBox.
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
26 sept. 2018 à 13:30
Bonjour Merci pour votre réponse. Mon programme est en C#.

private void MyTextBox_TextChanged(object sender, EventArgs e)
{

SerialsCounter = MyTextBox.Lines.Length-1;
label2.Text = "Il y a " + SerialsCounter.ToString() + " de produits.";




//-----------ENREGISTREMENT AUTOMATIQUE------------------------------
// Create a string array with the lines of text


string text = MyTextBox.Text+ Environment.NewLine;



// Append new lines of text to the file
File.AppendAllText(Path.Combine(@"\\MonSRV\"test.txt"), text);

}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 26 sept. 2018 à 13:36
Tu n'es pas sur le bon forum. Ici c'est du C++.
Je te redirige vers le forum C#.

Je serais tenté de dire que ça vient du append. A chaque changement, à chaque entrée d'une lettre, tu vas enregistrer dans un fichier à la suite tout ce que tu as. Écris dans ton fichier en écrasant au lieu d'append et ça devrait le faire.

Pas sûr que d'écrire dans un fichier à chaque caractère entré soit adapté niveau performance... Ça me parait assez sale. Sans doute un spécialiste C# pourra te répondre mieux que moi.

0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
26 sept. 2018 à 14:18
Bonjour,

Merci pour la redirection.

La finalité de mon programme est de pouvoir ouvrir un fichier, d'écrire le contenu du textbox en l’occurrence un code barre et de l’enregistrer automatiquement (sans cliquer sur un bouton). Si j'ai une coupure du programme pour x ou y raison, je dois être capable de réécrire dans le même fichier à la suite sans écraser le contenue précédent.
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 27 sept. 2018 à 10:26
Sans faire de C#, il me semble qu'il y a ici un problème fondamental: tu ne peux écrire à la suite des codes barres. Vu que tu es attaché à un évènement "onTextChange", le moindre changement (donc le moindre caractère entré) va déclencher ta méthode.
Donc tu vas append à chaque changement, soit chaque caractère entré ou supprimé.

Soit tu fais un bouton "enregistrer" et tu mets à la suite dans ton fichier, soit tu fais un onTextChange, mais tu devras écraser ton fichier à chaque fois. Tu ne peux logiquement pas faire les deux.

Je ne vois pas trop l'intérêt de le faire au "onTextChange". Si tu as une coupure du programme et que la personne n'a pas fait "enregistrer", tu ne peux pas y faire grand chose. C'est à elle de le faire. Au pire elle perdra un code barre qu'elle devra réécrire, ce n'est pas la mort.

0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
26 sept. 2018 à 21:25
Salut, c'est bon tu peux faire du C# ;)!

@Emilie.
Tu souhaites enregistrer au fil de l'eau sans cliquer sur un bout, OK.
Mais quand le gars à finit de taper un code barre, et qu'il passe au suivant, comment il fait? Il efface le textbox, et réécrit tout?
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
27 sept. 2018 à 09:40
Bonjour,

Merci de ta réponse.
Oui c'est tout a fait ça, je souhaite faire un enregistrement au fil de l'eau.
Le code barre est flashé par un lecteur de code barre et est écrit dans le textbox avec un retour chariot. Le suivant est écris sur la deuxième ligne, le troisième sur la troisième ligne etc sans action de l’opérateur ( pas de bouton valider ou sauvegarder).
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
27 sept. 2018 à 09:43
Bonjour @cptpingu,

Je suis d'accord avec toi que ce n'est pas la mort de réécrire un code barre, mais là, le programme va lire plus de 1000 codes barres par jour. Se serait une grosse perte de temps que de re-saisir tout les codes barres si le programme se plante ou s'il y a une coupure.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 sept. 2018 à 10:26
Je suis d'accord avec toi que ce n'est pas la mort de réécrire un code barre, mais là, le programme va lire plus de 1000 codes barres par jour


Si tu as un lecteur de code barre, alors c'est la mauvaise approche. Il te faut simplement, à la lecture du code barre, l'afficher dans un label, et le mettre dans un fichier. Si tu as besoin de le mettre dans un TextBox, c'est que tu as besoin de le valider/éditer et donc qu'il te faut plutôt un TextBox + Bouton validation.
Si la lecture est massive et automatique, pourquoi ne pas le mettre directement dans un fichier ?
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
27 sept. 2018 à 15:05
Je viens de tester en mettant le contenue dans un label mais j'ai le même résultat.
A savoir :
3
32
326
3268
32688
326884
3268840
32688400
326884000
3268840001
32688400010
326884000100
3268840001008
3268840001008

Je ne met pas directement dans un fichier car je dois ajouter a la fin de chaque ligne un ; et la date complète.

Le résultat attendu est : 3268840001008;20180927140351
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 27 sept. 2018 à 15:32
Ok tu n'as pas compris ce que je te dis. Mettre un label, un TextBox, un custom widget, ou image du pape animé avec le texte ne changera rien au problème.

Ton souci vient du fait que tu enregistres dans un fichier à chaque changement. Tu ne dois tout simplement pas faire ça. Tu ne dois enregistrer ton fichier que si l'utilisateur à fini de taper, et tu ne peux savoir qu'il a fini de taper que s'il te le dit, donc avec un bouton de validation.

Je parlais du label dans le cas ou tu ne demandes pas à l'utilisateur de rentrer un code barre, mais que celui-ci est récupéré d'un coup par un outil (scannette ?), et donc mis dans un label (ou une TextBox) "d'un coup".

Deux solutions:
1) Il y a lecture massive sans intervention humaine => tu mets directement dans un fichier (avec la date si tu veux). La text box n'est même pas nécessaire, à part pour montrer ce qui a été lu par l'outil.
2) Il y a intervention humaine => tu mets un bouton valider.
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
27 sept. 2018 à 15:58
Pour moi se sera la solution numéro 1 : pas d'intervention humaine.

Je dois écrire dans un fichier ex: Prod20180927.txt (1 par jour - ProdDATEDUJOUR) dans ce fichier par contre on me demande sur chaque ligne le code barre + la date complète à savoir:
3268840001008;20180927140351
3268840001009;20180927140410
et ces informations ne doivent pas être écraser s'il le fichier est fermé et ré-ouvert. Je dois écrire à la suite.

Je ne vois pas trop comment faire pour lire l'information du code barre sans textbox et de plus quand j'ajout la date sur le label :

label3.Text = Txt_Ecriture.Text + ";"+ date + Environment.NewLine;

Je récupère la date que sur le dernier code barre pas à chaque code barre.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 27 sept. 2018 à 16:15
Il n'y a pas besoin de passer par un TextBox pour écrire dans un fichier (encore heureux !).
Ton outil de scan doit te renvoyer une valeur. Cette valeur peut être mise dans un fichier, avec ce que tu veux à côté (la date). Tu peux à la limite afficher visuellement ce que tu vas mettre dans le fichier, mais c'est parallèle à ton écriture, ce n'est pas lié et tu pourrais très bien écrire dans ton fichier sans que ça se voit visuellement.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
27 sept. 2018 à 16:19
Peux tu poster le code qui lit ce que donne la scannette?
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
28 sept. 2018 à 08:55
voici de que me donne mon scan
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
28 sept. 2018 à 13:10
Ok, j’ai pas été explicite.
Ce dont on a besoin pour t’aider c’est le code C#.
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
1 oct. 2018 à 08:14
namespace LectureCodeBarre
{
public partial class Form2 : Form
{
int SerialsCounter = 0;
string date = DateTime.Now.ToString("yyyyMMddHHmmss");
public Form2()
{
InitializeComponent();
}

private void Btn_Fermer_Click(object sender, EventArgs e)
{
this.Close();
}
private void Txt_Ecriture_TextChanged(object sender, EventArgs e)
{
SerialsCounter = Txt_Ecriture.Lines.Length-1;
label2.Text = "Il y a " + SerialsCounter.ToString() + " de produits.";
Txt_Ecriture.ScrollBars = ScrollBars.Both;

label3.Text = Txt_Ecriture.Text;


//-----------ENREGISTREMENT AUTOMATIQUE------------------------------


//string text = MyTextBox.Text+ Environment.NewLine;



// Append new lines of text to the file
File.AppendAllText(Path.Combine(@"\\MONSRV\TEST_"+date+".txt"), label3.Text );


}

private void label2_Click(object sender, EventArgs e)
{

}

private void label3_Click(object sender, EventArgs e)
{

}


}
}
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
1 oct. 2018 à 19:22
Pour poster un code merci d’utiliser les balises de code.
Voir https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Tu nous montres à nouveau le code qui écrit dans le fichier le contenu du textbox.
Ce que je voudrais voir, c’est de la scanette vers le textbox.
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
2 oct. 2018 à 08:29
il n'y a pas de code, le lecteur de scan est interprété comme un clavier.
Du coup, lorsque je scan c'est comme si je rentrais le code via le clavier.

sinon voici mon program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace LectureCodeBarre
    {
    static class Program
        {
        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main()
            {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MENU());
            }
        }
    }
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
2 oct. 2018 à 08:56
OK, et y'a t'il un caractère qui "finit" la saisie, genre un \0, \r, \n....?
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
2 oct. 2018 à 09:00
un retour chariot qui se fait par le lecteur de scan
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
2 oct. 2018 à 16:16
Ha ben voilà, il faut que tu détectes le retour chariot, et seulement là tu écrits dans ton fichier.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
4 oct. 2018 à 16:08
As tu réussi ?
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
8 oct. 2018 à 13:52
Bonjour,

Non, je n'ai pas réussi, a chaque fois j'ai sois une ligne par caractères soit le ; et la date sont sur le dernier code barre,

Même avec un textbox simple ligne.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
8 oct. 2018 à 21:51
Bonsoir

ce code marche avec un vrai clavier, quand "Entrée" est tapé.
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter)//si entrée est tapé
            {
                File.AppendAllText("leFichier.txt", textBox1.Text + Environment.NewLine);//ouvre le fichier, et y ajoute le texte contenu dans le textbox
                textBox1.Text = "";//efface le textbox
                e.Handled = true;//indique au système que 'évènement est traité
            }
        }


A tester
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
9 oct. 2018 à 14:08
Bonjour,

Merci beaucoup cela fonctionne nickel, je vais pouvoir avancer sur mon test de doublons entre la ligne -1 et la dernière ligne et ensuite ajouter mon ; et la date.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
9 oct. 2018 à 23:43
Pour le doublon, si tu veux juste vérifier que le même « produit » n.est pas scanné 2 fois de suite, tu peux stocker le code dans 1 variable pour comparer.
Par contre, si tu dois n’avoir qu’une fois le code dans un fichier, alors je te conseille de remplir une liste au fur et à mesure, de l’initier éventuellement avec à partir d’un fichier existant, et de chercher avec Contains, Find, Where, etc...
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
10 oct. 2018 à 16:17
Oui c'est bien pour vérifier 2 scans qui se suivent. Une petite question, j'ai trouvé pour mettre la date et l'heure après le scan, le soucis c'est que l'heure les minutes et les secondes ne changent pas, l'heure afficher et l'heure d'ouverture du programme, comment puis-je récupérer l'heure courante?
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
10 oct. 2018 à 17:13
Bonjour !
en 15 secondes je trouve cela sur le Net : https://www.commentcamarche.net/forum/affich-9448648-heure-d-un-datetime-now-au-format-24h-c
Un salut à Whismeril
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
10 oct. 2018 à 21:09
Salut VB.
On peux aussi faire
DateTime.Now.ToLongTineString();
ou
DateTime.Now.ShortTineString();
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
11 oct. 2018 à 09:43
Bonjour VB95, merci de ta réponse mais c'est ce que j'ai fait et la date et l'heure sont celles de l'ouverture du programme et pas la heure courante
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
11 oct. 2018 à 12:20
DateTime.Now retourne l'heure courante
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
16 oct. 2018 à 17:46
Tout d'abord, merci à Jordane d'avoir édité ton message, pour remettre en ordre la coloration syntaxique.

Il faut que ta variable comparaison soit extérieure à la méthode, car si elle est interne à la méthode elle n'existe plus dès que l'exécution en sort.

   string ComparaisonDouble = "";//en déclarant comparaison ici elle existe en dehors de textBox1_KeyDown donc à la fin de l'exécution, elle existera toujours et son contenu sera conservé
   private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                string ValeurTextBox= textBox1.Text;
            
                if (e.KeyCode == Keys.Enter  &&  ComparaisonDouble!= ValeurTextBox)//si entrée est tapé et s'il n'y a pas doublon
                    {
//....

0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
18 oct. 2018 à 10:51
Bonjour,

Merci de ta réponse, j'ai pas eu le temps de mi pencher plus que ça, mais à l’exécution j'ai un retour à la ligne dès le premier caractère.
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
18 oct. 2018 à 17:21
C'est à dire ça recommence comme avant?
Si oui peux tu poster ton code actuel?
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
19 oct. 2018 à 08:30
Non ça ne fait pas comme avant. Là, il lit un caractère par un caractère. Comme si il fessait entrer à chaque caractère.
exemple:

6;20181017105527
3;20181017105530
3;20181017105533
3;20181017105534
6;20181017153124
6;20181017153125
6;20181017153126
6;20181017153129
3;20181017153131
2;20181017153132
5;20181017153133
5;20181017153134
6;20181017153135
6;20181017153135
6;20181017153136


Mon code
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace TEST_Saisi_Enregistrement
    {
    public partial class Form1 : Form
        {
            string DateFichier = DateTime.Now.ToString("yyyyMMdd");
        
        public Form1( )
            { 
            InitializeComponent();
            

            }
        private void button1_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }
  
            
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                string ValeurTextBox= textBox1.Text;
                string ComparaisonDouble = "";


                if (ComparaisonDouble != ValeurTextBox && e.KeyCode == Keys.Enter )//si entrée est tapé
                    {
                       
                          
                    File.AppendAllText(@"\\MONSRV\MONREP\TEST" + DateFichier + ".txt", ValeurTextBox + ";" + DateTime.Now.ToString("yyyyMMddHHmmss") + Environment.NewLine);//ouvre le fichier, et y ajoute le texte contenu dans le textbox avec un ; et la date
                    textBox1.Text = "";//efface le textbox            
                    e.Handled = true;//indique au système que 'évènement est traité
                    label2.Text = ComparaisonDouble;
                    ComparaisonDouble = ValeurTextBox;
                            label1.Text = ValeurTextBox+ " Valeur text box";
                            label3.Text = ComparaisonDouble + " valeur comparaison";
                           
                      }
                  else
                      {                         
                          label1.Text = " Valeur identique";
                          textBox1.Text= "";//efface le textbox
                       }
                        
                }

        private void label1_Click(object sender, EventArgs e)
            {

            }

        private void label2_Click(object sender, EventArgs e)
            {

            }

        private void Form1_Load(object sender, EventArgs e)
            {

            }

        private void label3_Click(object sender, EventArgs e)
            {

            }

        }
    }
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
19 oct. 2018 à 11:26
Donc merci d'appliquer ce que je t'ai indiqué au message 37.
0
EmilieAu Messages postés 22 Date d'inscription mercredi 26 septembre 2018 Statut Membre Dernière intervention 26 octobre 2018
19 oct. 2018 à 14:50
Peux-tu me dire si je suis sur la bonne voie?

 public string Comparer (string ComparaisonDouble)
           {
           
               
               return ComparaisonDouble;
               
           }

        
        
        public void textBox1_KeyDown( object sender, KeyEventArgs e)
            {
                string ValeurTextBox= textBox1.Text;
                

                if (e.KeyCode == Keys.Enter && ComparaisonDouble != ValeurTextBox)//si entrée est tapé
                    {
                       
                          
                    File.AppendAllText(@"\\10.143.17.3\Prod_Chq_TEST\TEST" + DateFichier + ".txt", ValeurTextBox + ";" + DateTime.Now.ToString("yyyyMMddHHmmss") + Environment.NewLine);//ouvre le fichier, et y ajoute le texte contenu dans le textbox avec un ; et la date
                    textBox1.Text = "";//efface le textbox            
                    e.Handled = true;//indique au système que 'évènement est traité
                    label2.Text = ComparaisonDouble;
                    ComparaisonDouble= ValeurTextBox;
                            label1.Text = ValeurTextBox+ " Valeur text box";
                            label3.Text = ComparaisonDouble + " valeur comparaison";
                           
                      }
                  else 
                      {                         
                          label1.Text = " Valeur identique";
                            // ne pas ecrire dans le fichier texte ou supprimer la ligne
                          textBox1.Text= "";//efface le textbox
                          e.Handled = true;
                       }
                        
                }
0
Rejoignez-nous