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);
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.
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.
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.
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.
@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?
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).
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.
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 ?
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
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.
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.
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.
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;
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());
}
}
}
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é
}
}
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.
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...
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?
Bonjour !
il faut que cette heure courante soit insérée à chaque fois que tu flashes un code et surtout ne pas la mettre en variable au début de ton programme sinon ce n'estplus l'heure corante évidemment
Merci pour vos explications sur l'horodatage cela fonctionne nickel quand la boucle.
Un autre soucis avec mon programme pour la comparaison, mon programme me demande initialiser ma variable de comparaison (string) (exemple : string Comparaison =" ") au début du programme du coup lorsque je fini ma boucle et que je veux copier le dernier résultat dans Comparaison cela ne fonctionne pas, je n'arrive pas remplacer la valeur de départ de Comparaison.
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
string ValeurTextBox= textBox1.Text;
string ComparaisonDouble = "";
if (e.KeyCode == Keys.Enter)//si entrée est tapé
{
//if ( ComparaisonDouble!= ValeurTextBox )//
// {//
label1.Text = ValeurTextBox+ "Valeur text box";
label3.Text = ComparaisonDouble + "valeur comparaison";
if (ComparaisonDouble == ValeurTextBox)
{
label1.Text = "Valeur identique";
textBox1.Text = "";//efface le textbox
}
//}//
else
{
File.AppendAllText(@"\\MONSERV\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
ComparaisonDouble = ValeurTextBox;
//
label2.Text = ComparaisonDouble;
e.Handled = true;//indique au système que 'évènement est traité
// label1.Text = "Valeur identique";
// textBox1.Text = "";//efface le textbox
}
}
}
EDIT : Correction des balises de code mal positionnées...
Comment dois-je mis prendre dois-je utiliser une autre boucle que if et comment faire pour la variable change de valeur a chaque exécution? Merci
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
{
//....
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;
}
}
Oui j'ai lui le message 37 ou tu dis de faire une méthode extérieur. Mais qu'est-ce qu'une méthode extérieur? un appel a un autre programme? Une nouvelle classe?
Non je ne t'ai pas dit de faire une méthode extérieure.
Je t'ai dit et montré le code, de sortir ta variable de la méthode.
Dans le code que tu montres,
il y a une nouvelle méthode "Comparer", qui n'est pas utilisée.
je ne voie pas où et comment est déclarée la variable ComparaisonDouble.
Même si le problème ne vient pas peut-être pas de là, j'aimerais au moins voir que tout est adapté comme je te l'ai proposé, au cas où.
Bonjour, un grand merci pour ta patience et tes explications.
J'avais vraiment mal lu et compris ton explication en 37. Toutes mes excuses.
La comparaison fonctionne nickel mais je me retrouve avec un nouveau problème. Il n'y a que le premier caractère de mon scan qui s'affiche et qui est enregistrer.
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();
}
string 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(@"\\SRV\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;
}
}
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)
{
}
}
}
Résultat dans mon fichier texte:
3;20181026132117
2;20181026132129
4;20181026132130
Je pense que cela vient du else.
En effet, si le key.code n'est pas Enter, tu effaces le textbox.
Essaye comme ça
string ComparaisonDouble = "";
public void textBox1_KeyDown( object sender, KeyEventArgs e)
{
string ValeurTextBox= textBox1.Text;
if (e.KeyCode == Keys.Enter)//si entrée est tapé
{
if(ComparaisonDouble != ValeurTextBox)//seulement après un Entré, on vérifie qu'il n'y a pas doublon
{
File.AppendAllText(@"\\SRV\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
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
}
//ce qui suit est fait dans les 2 cas, donc pas la peine de le mettre dans le if et dans le else.
textBox1.Text= "";
e.Handled = true;
}
}