IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)
    Bonjour,


    Je ne parviens pas à résoudre un problème de recherche dans un DatagridView.

    Alors voilà, j'ai un Datagrid qui m'affiche les données venant d'une base de donnée locale (un fichier .mdf).

    J'ai placé un TextBox et un Bouton de recherche afin de mettre en évidence le texte recherché à chaque fois qu'il le trouve dans le Datagrid, quelque soit la colonne.

    Lorsque j'indique une valeur dans le champ de texte et que je lance la recherche, toutes les cellules contenant le texte recherché sont bien sélectionnées.

    Par contre, j'ai également prévu le fait de ne pas trouver la valeur et de l'indiquer avec un message, mais cela ne fonctionne pas.

    Après de longues recherches, j'ai fini par comprendre que mon script finissait dans le "Catch ex As Exception" à cause de la dernière ligne du Datagrid qui est vide.

    J'ai tenté de passer par des conditions supplémentaires, comme la fonction While afin de ne pas aller à cette ligne vide mais cela ne marche pas.

    Quelqu'un pourrait-il m'aider ?

    Voici mon code :

    Code VB-NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            Try
                DataGridView1.ClearSelection()
                Dim Trouv As String
                Trouv = 0  'je ne sais si il y a une meilleure methode que cette variable "Trouv" pour gérer la recherche
     
                For Each myRow As DataGridViewRow In DataGridView1.Rows
                    For Each myCell As DataGridViewCell In myRow.Cells
                        If InStr(myCell.Value.ToString, TextBox4.Text) Then
                            myCell.Selected = True
                            Trouv = 1
                        End If
                    Next
                Next
     
                'Apparemment n'arrive pas à la ligne suivante car sortie du Try !
                TextBox4.Text = ""
                If Trouv = 0 Then
                    MessageBox.Show("Valeur non trouvée")
                End If
            Catch ex As Exception
                Exit Sub
            End Try
            TextBox4.Text = ""
        End Sub

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)
    Voilà, j'ai fini par trouver une solution.
    Comme mon DatagridView ne sert qu'à lire le contenu d'une base et que je n'ai pas besoin d'ajouter de ligne manuellement, j'ai mis l'option AllowUserToAddRow à False.
    A la lecture des données dans mon DatagridView, la ligne vide à la fin n'est plus visible et mon script va maintenant jusqu'au bout.
    J'ai modifié celui-ci pour qu'il affiche un message si le champ de recherche est vide.
    Je ne sais pas si un meilleur code est possible mais il répond au besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            Try
                DataGridView1.ClearSelection()
                Dim Trouv As String
                Trouv = 0
                If TextBox4.Text = "" Then
                    MessageBox.Show("Indiquer une valeur à rechercher")
                Else
                    For Each myRow As DataGridViewRow In DataGridView1.Rows
                        For Each myCell As DataGridViewCell In myRow.Cells
                            If InStr(myCell.Value.ToString, TextBox4.Text) Then
                                myCell.Selected = True
                                Trouv = 1
                            End If
                        Next
                    Next
                    TextBox4.Text = ""
                    If Trouv = 0 Then
                        MessageBox.Show("Valeur non trouvée")
                    End If
                End If
            Catch ex As Exception
                Exit Sub
            End Try
            TextBox4.Text = ""
        End Sub

  3. #3
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Je te propose d'essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim IndexLigne As Integer
    Dim IndexColonne As Integer
            For IndexLigne = 0 To DataGridView1.Rows.Count - 1 ' -2 si existe ligne vierge au bas du DGV
                For IndexColonne = 0 To DataGridView1.Columns.Count - 1
                    If DataGridView1.Item(IndexColonne, IndexLigne).Value = TextBox4.Text Then
                        '           DataGridView1.Item(IndexColonne, IndexLigne).Style.ForeColor = Color.Red
                        DataGridView1.Item(IndexColonne, IndexLigne).Selected = True
                    End If
                Next
            Next
    La boucle des lignes tourne 0 à Rows.Count - 1 s'il n'y a pas une ligne vide à la fin du DGV (si .AllowUserToAddRows = False) et il faut corriger à -2 dans le cas contraire.

    J'espère que ceci t'aidera ...


    Je vois en postant que tu as trouvé une solution ..., à 1 minute près !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)
    Bonjour Phil et merci pour ce retour.

    J'essaye ce soir ta solution au cas où j'aurais un autre Datagridview avec une ligne vide que je ne dois pas supprimer.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)
    Bonsoir Phil,


    Çà ne marchait pas au début, j'ai du ajouter un ToString pour la recherche de la valeur de mon TextBox.

    Je suppose que çà doit être dû au contenu de mes données : du texte, des chiffres et même des caractères.

    Je n'ai pas trouvé mieux que la variable "Trouv" pour gérer l'absence de résultat pour la recherche.

    En tout cas, çà fonctionne parfaitement pour pouvoir gérer une ligne vide. Merci encore !


    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            Try
                DataGridView1.ClearSelection()
                Dim Trouv As String
                Trouv = 0
                If TextBox4.Text = "" Then
                    MessageBox.Show("Indiquer une valeur à rechercher")
                Else
                    Dim IndexLigne As Integer
                    Dim IndexColonne As Integer
                    For IndexLigne = 0 To DataGridView1.Rows.Count - 1
                        For IndexColonne = 0 To DataGridView1.Columns.Count - 1
                            If DataGridView1.Item(IndexColonne, IndexLigne).Value.ToString = TextBox4.Text Then
                                DataGridView1.Item(IndexColonne, IndexLigne).Selected = True
                                Trouv = 1
                            End If
                        Next
                    Next
                    TextBox4.Text = ""
                    If Trouv = 0 Then
                        MessageBox.Show("Valeur non trouvée")
                    End If
                End If
            Catch ex As Exception
                Exit Sub
            End Try
            TextBox4.Text = ""
        End Sub

  6. #6
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    OK mais il y a un problème ...

    Pourquoi déclares-tu Trouv de type String alors que tu y mets un entier ?

    De plus, dans la boucle, tu mets affecte 1 à la variable Trouv, ce qui te permets de savoir ensuite si une cellule a été trouvée. Il ne s'agit ici que d'une option, mais si au lieu d'écrire Trouv = 1 dans la boucle, tu écrivais Trouv += 1 , non seulement tu saurais si une cellule a été trouvée, mais tu saurais combien il y a de cellule(s) trouvée(s).

    Ce qui est impératif, c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            Try
                DataGridView1.ClearSelection()
                Dim Trouv As Integer 
                Trouv = 0
    ' ... ... ...
    Bonne soirée,

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)
    Bonjour Phil et merci de ce retour.

    En effet, ce serait intéressant pour moi de pouvoir compter le nombre de fois où le texte a été trouvé.

    J'essaye çà ce soir !

    Avec cette idée, je suppose qu'il est ensuite possible d'enregistrer à chaque fois la position des cellules trouvées et à la fin de repasser par chacune d'elles avec des boutons NEXT/PREVIOUS.

    Pour y parvenir, l'utilisation d'une variable de type tableau est-elle une bonne idée ?

    Merci encore pour cette aide !

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bien sûr que tu peux consulter les cellules ensuite.
    Mais il faut savoir quel est ton objectif ...
    Tant que les cellules sont sélectionnées, le code suivant permet de les revisiter (pour changer la couleur du texte dans cet exemple, ce qui permet de les distinguer des autres ensuite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            For Each C As DataGridViewCell In DataGridView1.SelectedCells
                C.Style.ForeColor = Color.Blue
            Next
    DataGridView1.ClearSelection()
    Ce code peut être placé dans une autre procédure que celle qui fait la sélection.

    Si tu veux récupérer les indices de colonnes et lignes des cellules sélectionnées pour un usage dans d'autres procédures, il faudra effectivement imaginer une table ou une List. La List donne l'avantage qu'elle gère seule ses modifications de taille.

    Par exemple, dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        Structure AdresseCellule
            Dim Colonne As Integer
            Dim Ligne As Integer
        End Structure
     
        Dim UneAdresseDeCellule As AdresseCellule
     
        Dim MesCellulesSelectionnees As New List(Of AdresseCellule)
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            For Each C As DataGridViewCell In DataGridView1.SelectedCells
                UneAdresseDeCellule.Colonne = C.ColumnIndex
                UneAdresseDeCellule.Ligne = C.RowIndex
                MesCellulesSelectionnees.Add(UneAdresseDeCellule)
            Next
            DataGridView1.ClearSelection()
        End Sub
     
     
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            For IndiceCellule As Integer = 0 To MesCellulesSelectionnees.Count - 1
                MessageBox.Show("Valeur trouvée en C" & MesCellulesSelectionnees(IndiceCellule).Colonne & "L" & MesCellulesSelectionnees(IndiceCellule).Ligne)
            Next
        End Sub
    La structure définit un type de valeur qui vaut une paire d'indices de DataGridView. Ensuite la List(Of) est une collection destinée à recevoir des valeurs de ce type (paire d'indices de DataGridView). Une variable de ce type est aussi déclarée, seulement pour faciliter la compréhension du code sa relecture.

    Dans la procédure Button2_Click, je stocke dans la liste, toutes les paires d'indices des cellules sélectionnée et dans Button3_Click, j'affiche les adresses des cellules qui étaient sélectionnées sous la forme CxLy (comme en XLS).

    Ce n'est qu'une illustration de ce qui est possible ...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Points : 31
    Points
    31
    Par défaut Recherche dans un DatagridView (VISUAL STUDIO / VB-NET)
    Bonsoir Phil et merci pour toutes ces explications.


    Une fois que j'aurai fait la recherche d'une valeur, je vais juste donner la possibilité de repasser sur chacune des valeurs trouvées, alors le premier code me convient tout à fait.

    Je ne pense pas devoir revenir sur ces cellules plus tard mais je vais quand même garder l'exemple suivant pour d'autres options !

    Merci encore pour cette aide précieuse.

  10. #10
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonsoir Thierry,

    Attention que le premier code revisite les cellules sélectionnées, cela signifie aussi que si la sélection disparait (parce qu'un Clear a été programmé, ou bien simplement parce qu'on a cliqué une autre cellule du DGV), la revisite n'est plus possible.
    Par contre, elle est toujours possible avec le second code parce que les adresses des cellules sont mémorisées.

    Mais comme je l'indiquais précédemment, ça dépend de ce que tu veux faire ...

    Au moins, tu as des outils ..., je t'en souhaite la meilleure satisfaction.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/04/2014, 15h23
  2. recherche pour Vtk - c++/visual studio
    Par sbitsch dans le forum C++
    Réponses: 0
    Dernier message: 28/12/2007, 14h06
  3. Réponses: 1
    Dernier message: 26/04/2007, 13h46
  4. Réponses: 4
    Dernier message: 28/03/2007, 13h47
  5. [Déutant][Visual studio][vb.net]
    Par Abdelmoumen dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/11/2005, 21h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo