C# WinForm + Scanner de code à Barres d'entrée, TextChanged Erreur
MISE À JOUR: LA SOLUTION À LA FIN
J'ai un Winform, label1 affiche quelques infos retournées à partir d'une Recherche SQL à l'aide de l'entrée (MemberID) reçu de scanner de code à barres via txtBoxCatchScanner
.
Scénario est que les gens glisser leur MemberID Cartes sous le scanner, pour passer à travers la réception et la Winform automatiquement de faire une Recherche sur ce MemberID et la restitution de leurs infos telles que "l'Expiration de l'Adhésion", etc sur le réceptionniste de PC qui a la winForm dans un coin de son bureau.
J'ai le Code ci-Dessous fonctionne correctement sur la première utilisation (par exemple. la première personne)
Le nombre MemberID, par exemple 00888 vient dans la zone de texte, ADO.NET extrait les données à partir de SQL et affiche correctement.
une chose à noter, peut-être, le curseur est à la fin de la memberID: 00888|
Tout bon jusqu'ici, ALORS:
lors de glissement 2 (eg. la prochaine personne) arrive
leur nombre (disons, 00999) est mis sur la fin de la première dans le txtBox par exemple: 0088800999 alors, naturellement, quand TextChanged Feux de il recherche 0088800999 au lieu de 00999 ....
J'ai essayé:
txtBoxCatchScanner.Clear();
et
txtBoxCatchScanner.Text = "";
et
le rechargement de la forme
à la fin de mon code pour "rafraîchir" la zone de texte
mais je suppose qu'ils déclenchent l'Événement TextChanged
Comment puis-je recentrer ou ... effacer l'ancien numéro et le curseur au début de la txtBox après le balayage a fait ses trucs...
Je suis un débutant donc je suis sûr que le code ci-dessous est à peu de la merde....
Mais si quelqu'un a le temps, s'il vous plaît laissez-moi savoir comment le fixer à faire ce que je veux.
Mise à JOUR:
Ok après beaucoup d'expérimentation, j'ai réussi à obtenir cette 1/2 de travail maintenant, j'espère que quelqu'un plus d'expérience peut m'aider pour la fin! 😛
if (txtBoxCatchScanner.Text.Length == 5)
{
label1.Text = txtBoxCatchScanner.Text; //just a label for testing .. shows the memmber ID
txtBoxCatchScanner.Select(0, 5);
}
AFIN de numériser 1, dire 00888 , alors que se mis en évidence, analyse 2 , dire 00997 ... doux! remplace (pas ajoute) 00888 et le fait de la chose ... scan 2 0011289 ... DOH!!
Problème: tous les codes à barres sont à 5 chiffres! ils sont aléatoires, les longueurs!! Membre de l'ID de gamme à partir de 2 chiffres (par exemple. 25) à 10 chiffres, et permettrait de croître dans le futur...
Edit: quelque Chose que j'ai découvert c'est que les codes-barres sont lus comme individu touches. Je pense que c'est pourquoi la réponse 1 ci-dessous ne fonctionne pas et bien que le grand probmlems:
par exemple avec 00675 l'entrée (?de sortie) à partir du scanner est:
Bas: Ne
Jusqu': Ne
En Bas: Ne
Jusqu': Ne
En Bas: D6
Jusqu': D6
En Bas: D7
Jusqu': D7
En Bas: D5
Jusqu': D5
en bas: Retunn
Jusqu': Retour
autres infos: scanner de code à barres est: un Opticon OPL6845 USB
Grâce
private void txtBoxCatchScanner_TextChanged(object sender, EventArgs e)
{
Member member = new Member();
member.FirstName = "";
member.LastName = "";
//Get BarCode
//VALIDATE: Is a Number
double numTest = 0;
if (Double.TryParse(txtBoxCatchScanner.Text, out numTest))
{
//IS A NUMBER
member.MemberID = Convert.ToInt32(txtBoxCatchScanner.Text);
//SEARCH
//Search Member by MemberID (barcode)
List<Member> searchMembers = Search.SearchForMember(member);
if (searchMembers.Count == 0)
{
lblAlert.Text = "No Member Found";
}
else
{
foreach (Member mem in searchMembers)
{
lblMemberStatus.Text = mem.MemberStatus;
lblMemberName.Text = mem.FirstName + " " + mem.LastName;
lblMemberID.Text = mem.MemberID.ToString();
lblMessages.Text = mem.Notes;
if (mem.MemberStatus == "OVERDUE") //OR .. OR .. OR ...
{
lblAlert.Visible = true;
lblAlert.Text = "!! OVERDUE !!";
//PLAY SIREN aLERT SOUND
//C:\\WORKTEMP\\siren.wav
SoundPlayer simpleSound =
new SoundPlayer(@"C:\\WORKTEMP\\siren.wav");
simpleSound.Play();
}
else
{
lblAlert.Visible = true;
lblAlert.Text = mem.MemberStatus;
}
}
}
}
else
{
//IS NOT A NUMBER
lblAlert.Text = "INVALID - NOT A NUMBER";
////
//lblMemberName.Text = "";
//lblMemberID.Text = "";
//lblMemberID.Text = "";
}
SOLUTION:
Le Système ne me permet pas de répondre à ma propre question pour un autre 3 heures, comme je suis un newbie 1 seul post, il en sera de le mettre ici:
D'abord merci à tous pour votre aide et votre Patience.
J'Ai enfin trouvé une solition, pas entièrement testé encore que ses 2h du matin et l'heure du coucher.
suivant le long de mes mises à jour où j'ai eu du succès, mais a frappé la longueur variable de MemberID problème. J'ai maintenant à surmonter qu'avec le Code ci-dessous:
namespace SCAN_TESTING
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void txtBoxCatchScanner_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyValue == (char)Keys.Return)
{
e.Handled = true;
int barcodeLength = txtBoxCatchScanner.TextLength;
txtBoxCatchScanner.Select(0, barcodeLength);
//TEST
label3.Text = barcodeLength.ToString();
//TEST
label2.Text = txtBoxCatchScanner.Text;
}
}
Je vais l'ajouter à mon précédent "vrai" code et test le matin
Mais à ce stade, est en train de faire exactement ce que je veux! =]
Mise à jour: Testé .. fonctionne exactement ce qu'il fallait:
private void txtBoxCatchScanner_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyValue == (char)Keys.Return)
{
e.Handled = true;
int barcodeLength = txtBoxCatchScanner.TextLength;
txtBoxCatchScanner.Select(0, barcodeLength);
//
//INSERT ORGINAL CODE HERE. No Changes were needed.
//
}//end of if e.KeyValue ...
}//end txtBoxCatchScanner_KeyUp
Espère que ça aide quelqu'un dans le futur!! 🙂
Merci encore pour les 2 très bonnes solutions, je peux voir comment ils travaillent, et beaucoup appris.
Ça n'a pas fonctionné dans mon cas - qui est probablement dû à moi-même ou mon erreur/de ne pas comprendre, ou type de scanner.
- Gönül: pourquoi avez-vous augmentation l'indentation quand vous pourriez avoir enlevé?
- Le code qui va avoir le problème doit être le code qui permet d'affecter le texte de la textbox, pourriez-vous nous montrer un peu plutôt que le texte modifié de l'événement?
- P. s aussi dans la version finale d'autre, vous pouvez définir le texte de l'alerte à pas un nombre, mais vous ne faites pas l'étiquette visible
- Désolé d'avoir aucune idée de ce que tu veux dire à propos de la mise en retrait... RhysW ... il n'y a pas d'autre code, à l'exception de la part du public void FormScanner_Load et Public FormScanner()
- Ok dans quel cas pouvez-vous m'indiquer la section de code où vous définissez la zone de texte du texte à 00888 etc s'il vous plaît?
- le texte de la textbox vient de le scanner de code-barres et est cette partie: //EST UN NUMÉRO de membre.MemberID = Convert.ToInt32(txtBoxCatchScanner.Texte); ... si ça peut aider
- où est le code où vous le faites par exemple txtBoxCatchScanner.Texte = 00889; ou bien est-ce qui se passe à un tiers?
- J'ai enlevé le tiret 🙂
- les membres de code à barres est utilisé (par exemple. 00889) scanner d'entrée va à txtBoxCatchScanner qui déclenche TextChanged ... txtBoxCatchScannerText obtenir de son apport du scanner de code à barres .....
- ok, donc il obtient son entrée à partir du scanner, pouvez-vous me montrer le code où vous obtenez les informations de le scanner et de le mettre dans la zone de texte, je ne peux pas vous aider à résoudre le problème sans voir le code
- il n'y a pas d'autre code. scanner va dans le port usb... scanner le code à barres ... de codes-barres apparaît dans txtbox ... le code que j'ai posté ci-dessus est complète, il y a tout le code... en dehors de l'espace de noms, de chargement de la page etc.. il n'y a pas d'autre code. désolé, merci, de toute façon.
- Ok, mais le code-barres ne marche pas ne marche pas apparaître comme par magie dans la zone de texte, quelque part, en quelque sorte, d'un morceau de code mise en place du texte dans cette zone de texte, est-ce que votre code de définir la zone de texte pour être l'un des numéros ou est-ce un tiers formulaire windows?
- Soner & Uwe: merci pour ça, voir ce que u veux dire maintenant 😛 ... désolé à ce sujet, la première fois le poste.
- merci! 🙂 semble beaucoup mieux
- Oui il le fait, si le scanner est configuré comme un clavier USB, le plus simple scanners de codes à barres sont par défaut.
- Je viens de lire que le membre Id de longueur variable: Qu'advient-il si vous avez un membre
12
et un membre121
? Si vous avez un événement après chaque personnage (ce qui est le cas avec laTextChanged
événement - le scanner fonctionne comme taper un caractère après l'autre, de sorte qu'après chaque chiffre,TextChanged
est déclenchée), vous ne verrez jamais membre121
, que vous vous arrêtez après la découverte d'membre12
. Ne pas utiliserTextChanged
! Voir mon approche pour une propreté et une solution de travail. - j'essayais de disscern s'il avait accès au code qui l'a fait ou non, et non, il n'tmagically apparaître, il y a le code, et j'essayais de savoir si il y avait accès
- Oui, il y a le code. Dans le scanner pilote du clavier, ou le générique de Windows clavier USB pilote qui est le plus probablement utilisé pour manipuler ces appareils.
- justement! Je savais pas s'il avait accès à ce bien d'où mes nombreuses questions 🙂
- C'est juste que certaines personnes ont tendance à oublier d'émulation du clavier lorsque vous travaillez avec COM connecté scanners trop longtemps. 🙂
- Très Vrai, aussi la solution que vous avez fourni est de très bonne qualité, permet d'éviter plus de problèmes que de simplement l'une adressée
Vous devez vous connecter pour publier un commentaire.
Le scanner de code-barres vous utilisez semble fonctionner comme un CACHÉ - un clavier d'émulation. Chaque simple scanner de code à barres que je sais (et je travaille avec eux sur une base quotidienne) a la possibilité de spécifier un suffixe à la numérisation de codes à barres. Changer le suffixe
CRLF
et ajouter un bouton par défaut de votre formulaire. Scannant un code-barres qui se termine avecCRLF
sera alors automatiquement "appuyer sur le bouton".Déplacer le code qui effectue les contrôles de
TextChanged
événement dans le gestionnaire d'événement pour les boutonsClick
de l'événement et de supprimer lesTextChanged
gestionnaire d'événement. Puis, lorsque le bouton est cliqué, également effacer la zone de texte et définissez le focus à la zone de texte.Vous devriez être bon d'aller, maintenant.
Vous pouvez facilement vérifier si le scanner de code-barres a déjà le bon suffixe configuré: Ouvrez le bloc-notes et scanner des codes-barres. Si elles apparaissent sur des lignes distinctes, alors tout va bien. Sinon, vous aurez besoin de scanner des codes à barres de configuration du scanner manuel de l'.
Pour résumer le tout, ce doit être le code pour le bouton de
Click
événement:Cette solution évite les problèmes suivants:
XYZ
ne sera jamais trouvé, si il y a un membreXY
dans la base de données, ainsi que la vérification s'arrête après la découverte d'XY
XY
ne sera pas trouvé, mais seul membreZ
, parce que dans le 3. la zone de texte est effacé etZ
est le seul caractère saisi.CRLF
. Pour s'assurer que: fermez tous les programmes, démarrez le bloc-notes et d'analyse plusieurs fois. Faire de codes à barres apparaissent sur des lignes séparées? Autre solution: Ajouter un bouton à l'écran, de lui attribuer laClick
gestionnaire montrant unMessageBox
, définir la forme duAcceptButton
propriété du bouton "nouveau" puis exécuter et d'analyse - voyez-vous laMessageBox
? Si oui, tout va bien déjà.CRLF
est déjà présent, comme vous pouvez le voir la dernière touche enfoncée et publié par le scanner estRETURN
.Im pas sûr de savoir exactement quel est le véritable problème.
à la fois déclencher le "Changé" de l'Événement.
Mais ils ont aussi désactivez la case à cocher. De sorte que devrait être ce que vous voulez faire.
Vous pouvez le vérifier dès le début si la boîte est en fait vide, et de retour dans le cas où il est. Comme:
Si rien ne se passe, si la boîte est vide.
Si j'ai mal compris votre problème, veuillez le préciser et je vais essayer de l'aider.
Ce qui concerne
EDIT:
Votre fonction devrait fonctionner si elle regardait quelque chose comme ceci:
TextChanged
événement! C'est une mauvaise idée, car il est appelé à chaque fois que vous modifiez le texte - aussi, si l'utilisateur saisit manuellement le texte. Cela signifie que, lors de chaque personnage que vous ajoutez via clavier ou d'un scanner, d'un événement est déclenché, provoquant une validation de l'identification du membre. NE PAS! Je ne veux pas trop faire la publicité de mon approche, mais il est beaucoup plus propre...12
et un membre121
? Si vous avez un événement après chaque personnage, vous ne verrez jamais membre121
, que vous vous arrêtez après la découverte d'membre12
. Ne pas utiliserTextChanged
!La meilleure façon d'effacer la zone de texte sur la prochaine textChange événement.
Insérer cette ligne
txtBoxCatchScanner.SelectAll();
à la fin de TextChange fonction.. Cela sélectionnez le texte, de sorte que je peux être remplacé facilement sur le prochain événement.