Vérifier si text saisie dans la textbox existe dans un tableau [Résolu]

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 22 nov. 2016 à 19:55 - Dernière réponse : Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention
- 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
Afficher la suite 

28 réponses

Répondre au sujet
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 22 nov. 2016 à 20:45
+1
Utile
3
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

Cette réponse vous a-t-elle aidé ?  
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 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?
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 22 nov. 2016 à 21:59
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 22 nov. 2016 à 22:26
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)
Commenter la réponse de Whismeril
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 22/11/2016 à 20:37
0
Utile
19
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.
vb95 1505 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 23 nov. 2016 à 15:21
Bonjour Whismeril
Bien vu le KeyPress
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 23 nov. 2016 à 17:01
Salut Whismeril
merci pour ton aide, le code fonctionne très bien
je ne veux pas exagérer mais juste une dernière chose
au lieu d'utiliser un tableau je préfère utiliser la ListItems de la ComboBox, car la liste sera mise à jour a chaque fois, je me trompe peut-être mais on ne peut pas mise à jour un tableau de plus un tableau peut contenir un grand nombre de variable à des limites (je ne me souviens pas combien)
j'ai essayer avec cette méthode, est-ce Que C'est Juste?
 Private Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles ComboBox1.KeyPress
Dim tableau() As String
ReDim tableau(0 To ComboBox1.Items.Count - 1)
For i As Integer = 0 To ComboBox1.Items.Count - 1
tableau(i) = ComboBox1.Items(i).ToString
Next
Dim texte As String = ComboBox1.Text + Convert.ToString(e.KeyChar)
Dim resultat As List(Of String) = tableau.Where(Function(x) x.StartsWith(texte)).ToList()
If resultat.Count = 0 Then
e.Handled = True 'signifie que l'on a traité le keypress, donc la touche n'est pas validée
Else
ListBox1.DataSource = resultat
End If
End Sub

Les inconvénient que j'ai remarqué dans ton code :
1er mot je je ne peux pas utiliser la touche Backspace
2 eme mot je dois taper la lettre deux fois pour quel s'affiche dans la ComboBox
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 23 nov. 2016 à 17:43
Bon,
j'ai l'impression de tout le temps dire la même chose.
Un contrôle, n'a pas vocation à être une source de données, il y a des collections (le tableau en est une) ou les bases de données.

Le rôle d'un contrôle est d'afficher le contenu d'une source de données et d'en assurer la mise à jour.
Comme tu le dis le tableau est figé en nombre d'items, contrairement à la grande majorité des collections, l'une des plus simples à utiliser est la List.

Donc on charge une List
		Private liste As New List(Of String)() From {"Pavidrain", "Gravier maury", "Calcaire concassé ivoire", "Graviers de basalte", "Gravier palvdecor", "Graviers de dordogne"}
		End Sub



A un endroit judicieux, on binde la List sur le combobox.
            comboBox1.DataSource = liste


Enfin, dans le Keypress, on travaille avec la List, après s'être affranchi des touches de contrôles
		Private Sub comboBox1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)

			If Char.IsControl(e.KeyChar) Then 'si c'est une touche de contrôle, on sort
				Return
			End If

			Dim texte As String = comboBox1.Text + Convert.ToString(e.KeyChar)
			If Not liste.Any(Function(x) x.StartsWith(texte)) Then
				e.Handled = True
			End If



Ça mérite d'être améliorer, si tout ou partie du texte est sélectionné le futur texte n'est pas texte actuel + touche tapée. Je te laisse chercher un peu avec SelectedText, SelectionLength et SelectionStart.
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 23 nov. 2016 à 18:30
Resalut Whismeril,
Un contrôle, n'a pas vocation à être une source de données, il y a des collections (le tableau en est une) ou les bases de données.
Le rôle d'un contrôle est d'afficher le contenu d'une source de données et d'en assurer la mise à jour.


dit comme ça ça parait plus logique
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 23 nov. 2016 à 18:31
J'essaye de ne pas écrire trop de conneries en général....
Commenter la réponse de ucfoutu
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 24 nov. 2016 à 19:33
0
Utile
2
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
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 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.
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 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
Commenter la réponse de kikou93
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 25 nov. 2016 à 14:03
0
Utile
Merci à Whismeril, Ucfoutu, Vb95 et Kikou93 de m'avoir aider a résoudre mon problème
Merci Beaucoup
Commenter la réponse de Karin.code

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.