Vérifier si text saisie dans la textbox existe dans un tableau

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 22 nov. 2016 à 19:55
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 25 nov. 2016 à 14:03
Bonsoir,
mon problème est le suivant :
je voulais vérifier si un mot existe dans un tableau, en l'écrivant dans un textbox
je voulais que se soit vérifier automatiquement c-à-d à chaque fois que j'écris une lettre dans la Textbox par exemple :
dans le tableau il y a le mot suivant : "Gravier naturel"
Si je tape dans la Textbox : une première lettre "G"
alors rien ne s'affiche car il existe un mot dans le tableau avec la première lettre "G"
Si je tape dans la Textbox : une deuxième lettre "r" (le texte devient "Gr")
alors rien ne s'affiche car il existe un mot dans le tableau avec la première lettre "G" et la deuxième lettre "r"
Si je tape dans la Textbox : une Troisième lettre "i" (le texte devient "Gri")
Un message s'affiche car il le text écrit dans la TextBox n'existe pas ( un mot avec la première lettre "G" , la deuxième lettre "r" et la Troisième lettre "i" (Gri) n'existe pas dans le tableau)
j'ai pris une partie du code de l'un des poste de Kikou93, voici le code que j'ai créer :
Public Class Form1
Dim tableau() As String = {"Pavidrain", "Gravier maury", "Calcaire concassé ivoire", "Graviers de basalte", "Gravier palvdecor", "Graviers de dordogne"}
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
If TextBox1.Text.Length > 0 Then
For i As Integer = 0 To tableau.Count - 1
If Strings.Left(TextBox1.Text, TextBox1.Text.Length) <> Strings.Left(tableau(i).ToString, TextBox1.Text.Length) Then
MessageBox.Show("Ce type n'existe pas.", "Avertissement", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End If
Next
End If
End Sub
End Class

Je ne vois pas ou j'ai fait une erreur, quelqu'un pour me dire mon erreur
Merci pour votre aide

4 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
22 nov. 2016 à 20:45
Bonsoir

ça lit "Pavidrain" et ça te dit qu'il ne commence pas par G, puis ça lit "Gravier maury" et là ça ne te dit rien, puis ça lit "Calcaire concassé ivoire" et ça te dit qu'il ne commence pas par G, etc...

L'idée serait que tu fasses la recherche complète et qu'ensuite s'il n'y a pas de résultat, tu mettes le message.

			Dim tableau() As String = { "Pavidrain", "Gravier maury", "Calcaire concassé ivoire", "Graviers de basalte", "Gravier palvdecor", "Graviers de dordogne" }
			Dim texte As String = "G"
			If tableau.Where(Function(x) x.StartsWith(texte)).Count() = 0 Then
				MessageBox.Show("Y'en a pas")
			End If


Tu peux même afficher le résultat dans une ListBox pour montrer à l'utilisateur ce qu'il peut taper, parce que moi un message à chaque touche pas bonne ça m'agacerait très vite

			Dim tableau() As String = { "Pavidrain", "Gravier maury", "Calcaire concassé ivoire", "Graviers de basalte", "Gravier palvdecor", "Graviers de dordogne" }
			Dim texte As String = "G"
			Dim resultat As List(Of String) = tableau.Where(Function(x) x.StartsWith(texte)).ToList()
			If resultat.Count = 0 Then
				MessageBox.Show("Y'en a pas")
			Else
				listBox1.DataSource = resultat
			End If

1
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
22 nov. 2016 à 21:02
Bonsoir Whismeril,
Merci Pour ton aide le code fonction très bien, pour la ListeBox c'est une bonne idée merci
juste une dernière chose si ça ne te dérange pas bien sûr
je voulais utilisé dans une autre partie du programme une Combobox au lieu d'un tableau et d'une TextBox
J'ai fait ça avec ton code mais ça ne fonction pas
  Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
For i As Integer = 0 To ComboBox1.Items.Count - 1
If ComboBox1.Items(i).Where(Function(x) x.StartsWith(ComboBox1.Text)).Count() = 0 Then
'Action
End If
Next
End Sub

pourquoi?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
22 nov. 2016 à 21:59
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
Modifié par Karin.code le 22/11/2016 à 22:27
Merci pour le lien j'ai déjà vu ça dans le poste Kikou93
http://codes-sources.commentcamarche.net/forum/affich-10071123-creer-une-combobox-police-comme-celle-de-word#p10071167
j'ai choisi ça :
ComboBox1.AutoCompleteMode = AutoCompleteMode.Append '
ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems

tant que le texte que tu saisie dans la ComboBox existe dans la ListItems de la ComboBox une liste s'affiche avec des suggestions
si il n'existe pas après avoir taper la dernière lettre la liste des suggestions sera vide
dans se cas la je voulais qu'il efface Automatiquement la dernière lettre saisie avec le code :
ComboBox1.Text = ComboBox1.Text.Substring(0, ComboBox1.Text.Length - 1)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 22/11/2016 à 20:37
Bonjour
Juste pour éclairer ma lanterne (je ne connais rien de VB.Net, mais ai certains réflexes) :
que retourne :
 If Strings.Left(TextBox1.Text, TextBox1.Text.Length)

?
Car pour moi (pauvre même pas débutant en VB.Net) , au 1er coup d'oeil, je ne vois aucune logique (si la syntaxe est bonne, ce que j'ignore) qui différencierait le résultat de la propriété TextBox1.text
Mais bon ... je ne connais rien de VB.Net ...

EDIT : pour être très clair et SI TextBox1.Text.Length est comme je le pense le nombre de caractères que contient TextBox1.Text, je me demande comment l'on pourrait penser que tout ce qu'il y a dans une phrase, depuis son début (à gauche) jusqu'à sa fin serait différent de ce qu'est déjà la phrase ..... !!!

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
22 nov. 2016 à 20:48
Bonsoir ucfoutu,
Merci pour m'avoir répondu
C'est vrais j'ai fait une gros faut (que même un débutant ne le ferais pas)
dans ce qu'a la il y a pas de différence entre
TextBox1.Text
et
Strings.Left(TextBox1.Text, TextBox1.Text.Length)

si je voulais par exemple vérifier si les trois première lettre d'un long mot que se trouve dans la TextBox existe dans le tableau, cette méthode serait juste
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
22 nov. 2016 à 20:50
Bonsoir UC, je n'avais pas réactualisé la page, avant de poster ma réponse.
La propriété Length retourne bien le nombre de caractères d'un string.
Donc effectivement ce bout de code, retourne lui même.
En plus String(sans s).Left n'est pas du VB.Net mais un import de VB6.
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
22 nov. 2016 à 21:06
je me trompe peut être mais normalement pour vérifier si un code est un code vb.net ou vb6 on ajoute
Option Explicit On
Option Strict On
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
22 nov. 2016 à 21:58
Non ça n'est pas ça, il faut activer ces options pour se forcer à utiliser de bonnes pratiques, mais pour l'import VB6, c'est dans les références

Voici une capture pour VS2013
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
Modifié par vb95 le 22/11/2016 à 22:15
Bonsoir Karin.code
Option Explicit et Option Strict n'ont rien à voir avec le fait que le code soit VB Net et VB 6
1) Option Explicit t'oblige à déclarer toutes tes variables
2) Option Strict t'interdit de convertir implicitement un type de variable en un autre

Par contre pour éviter de mettre du pseudo code Vb 6 dans un projet VB Net tu fais ainsi :
1) tu vas dans Propriétés de ton projet
2) tu cliques dans Références
3) tu décoches Microsoft VisualBasic dans la liste en bas

Ceci fait que ton projet ne contient plus la référence à Vb 6 et ne peut plus utiliser les instructions et fonctions de VB 6 et que tu es obligée de n'utiliser que des instructions et fonctions VB Net

Prends le chaine "Microsoft VisualBasic"
=

Dim chaine as String = "Microsoft VisualBasic"
Dim chnleft1 as String = Left(chaine,9) ' c'est de l'Import VB 6
Dim chnleft2 as String = chaine.Sustring(0,9) ' c'est du vrai VB Net


Les 2 donnent comme résultat "Microsoft" et sont corrects . Mais pourquoi mettre du VB 6 alors que l'on programme en VB Net ? C'est comme si on avait une moto Harley Davidson avec un moteur de mobylette !

Pour ce code

Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
For i As Integer = 0 To ComboBox1.Items.Count - 1
If ComboBox1.Items(i).Where(Function(x) x.StartsWith(ComboBox1.Text)= True).Count = 0 Then
'Action
End If
Next
End Sub


Il manque le " = True" dans ton code: la fonction doit avoir un signe de comparaison (= ou > ou < ou etc.....) et une valeur à comparer sinon ce n'est pas une fonction
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
24 nov. 2016 à 19:33
Salut Karin.code
je pas le bonjour aussi a vb95 et Whismeril
je voulais utiliser le code de vb95 dans l'application que je travail sur elle en ce moment même, mais comme il à dit c'est vraiment énervant que à chaque fois que je tape une fausse lettre un message s'affiche, ou l'utilisateur peut ne pas comprendre pourquoi quand il tape une lettre celle-ci ne s'affiche pas car en réalité elle s'efface a la seconde ou elle sera écrit
je viens de trouver ce code et il ma l'aire plus approprié, c'est vrais il ne s'active pas à chaque fois que tu tape une lettre, il s'active a la fin aprés que le contrôle n'a plus le focus

 Private Sub ComboBox1_Validatiog(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ComboBox1.Validating
If ComboBox1.Items.Contains(ComboBox1.Text) Then
'Action
Else
MessageBox.Show("Ce texte n'appartient pas à la liste", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
ComboBox1.Text = ""
'ou
' ComboBox1.Text = ComboBox1.Items(0).ToString
End If
End Sub
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
24 nov. 2016 à 21:12
Bonsoir

le truc c'est que l'on a répondu au besoin de Karin.Code.

Je suis d'accord, en tant qu'utilisateur ne pas comprendre pourquoi la lettre que je tapes n'apparait pas est frustrant, alors qu'avoir un message à chaque touche fausse est agaçant.

Mais ce que tu proposes ne me plait pas non plus, une fois que j'ai tout tapé ça me dit "eh ben non!!!".

Il faut savoir être efficace donc informer clairement aussitôt qu'une touche est fausse sans être bloquant (la message box), c'est pourquoi j'ai proposé plus haut deux options qui ont général un bon retour utilisateur:
  • une listBox ou apparaissent les mots encore possible avec la saisie en cours, ça a l'avantage que l'on peut faire la recherche sur tout le corps du texte, par exemple, si je veux le Gravier palvdecor, sachant qu'il y a plusieurs graviers, je peux faire la recherche sur palvdecor.
  • L'autocomplétion, j'ai mis un lien vers un tuto plus haut.


Ces 2 options me semblent plus en phase avec ton besoin, qui je le rappelle n'est pas celui de Karin.Code.
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
24 nov. 2016 à 22:40
Bonsoir Whismeril,
Je m'excuse si me suis mal exprimé, mais je n'ai pas dit que c'était la meilleur solution, ce code peut être un plus pour le code que tu à mentionné plus haut
par exemple si en fait copier/coller d'un mot qui n'est pas dans la liste il ne sera pas effacer ou quand il efface la dernière lettre il reste le mot incomplèt, est que l'utilisateur passe à un autre contrôle ou clique sur la touche Entrer (avec le code suivant):
Private Sub ComboBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp
If e.KeyCode = Keys.Enter Then 'Si en clique sur la touche Entrer
'Action
End If
End Sub
un message s'affiche
on peut utiliser le code que j'ai mentionné plus haut pour éviter les erreur
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
25 nov. 2016 à 14:03
Merci à Whismeril, Ucfoutu, Vb95 et Kikou93 de m'avoir aider a résoudre mon problème
Merci Beaucoup
0
Rejoignez-nous