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

Accès aux données Discussion :

[2.0][C#] Se positionner sur la 1ère ligne dont une colonne correspond à un critère


Sujet :

Accès aux données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut [2.0][C#] Se positionner sur la 1ère ligne dont une colonne correspond à un critère
    Dans un des mes DataGridView, je fais une recherche, c'est à dire que je me positionne à la bonne place dans le DataGridView.
    Par exemple, pour une liste de clients, quand je suis trié sur la colonne nom et que je saisie "CA" je tombe sur "Caisse d'épargne".

    Pour arriver à cela, je fais une recherche dichotomique dans le DataGridView.

    Avant j'avais la même chose en VB6, et je faisait un Find sur le Recordset de la source de donnée.

    Si quelqu'un voit un meilleur moyen pour se positionner sur la 1ère ligne du DataGridView correspondant à un texte saisie je suis preneur.

  2. #2
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    En admettant que ton DGV est basé sur un BindingSource ou un DataView ou tout autre composant implémentant IBindingList, tu dois pouvoir utiliser la méthode Find.

    Si cette méthode ne te permet pas de saisir un critère partiellement comme tu le souhaites, alors, tu peux récupérer la valeur complète de ton critère (ou l'identifiant d'un d'une des DataRow sous-jacentes qui y correspondent) en utilisant une fonction comme DataTable.Compute.

    Pour ma part je n'ai jamais mis en oeuvre de fonction de recherche avancée par déplacement car je préfère filtrer directement mes lignes plutôt que de me déplacer dessus.
    (\ _ /)
    (='.'=)
    (")-(")

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse mais j'ai essayé et je m'en sors pas.

    Le Find déjà ne me permet pas de faire une recherche sur autre chose que la clé primaire, or je n'ai pratiquement jamais de clés primaire car je travaille sur de vues.

    Pour le compute, je ne trouve pas comment faire. J'ai cherché mais je ne vois pas comment je peux faire pour récupérer quelquechose qui me permet de me postionner sur ma ligne.
    Si je fais un DataTable.Compute("Min(Nom)", "Nom LIKE 'CA%'") ça va me donner la valeur du champ Nom de la ligne que je voudrais sélectionner mais ensuite ??

  4. #4
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Le Find déjà ne me permet pas de faire une recherche sur autre chose que la clé primaire
    Le Find d'un IList le peux. Or tu as bien un IList lorsque tu te lies à un DataTable ou à un BindingSource.

    Donc ensuite je pensais à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonIListSource.find("Nom",DataTable.Compute("Min(Nom)", "Nom LIKE 'CA%'"))
    (\ _ /)
    (='.'=)
    (")-(")

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Non ça va pas marcher car le Find ne se fait que sur la clé primaire.

  6. #6
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Si, c'est possible si tu utilises le Find d'un BindingSource.

    Par contre plutôt que d'utiliser DataTable.Compute, tu peux récupérer un tableau de DataRow (code de DarkMolo) :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       'MaDataTable.Select te renvoie un tableau de DataRow
       'correspondants au critère passé en paramètre
       Dim Vdr As DataRow() = dt.Select("MaColonne LIKE '" & TxtReference.Text & "'")
       If Vdr.Length > 0 Then      'Si y'a au moins une ligne correspondant au critère
             Me.MonBindingSource.Position = Me.MonBindingSource.Find("MaColonne", Vdr(0)("MaColonne"))
       End If

    PS: désolé, je sais que tu voulais du code C#, mais l'idée y est.
    (\ _ /)
    (='.'=)
    (")-(")

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Désolé tu va vraiment en avoir marre là je pense mais à quoi corresponds le Me.MonBindingSource ?

    Sachant que j'ai un DataView, un DataTable et un DataGridView, j'arrive pas à trouver là.

  8. #8
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Le BindingSource est un composant 2.0 que tu peux utiliser pour encapsuler ta source de données avec un gestionnaire de devise (pour gérer la navigation, etc.).

    Si tu ne veux pas utiliser de BindingSource, récupère directement le CurrencyManager associé à ton DataGridView en utilisant sa propriété BindingContext après avoir définit sa source de données (propriétés DataSource, DataMember).

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Définir la source de données
            Me.MonDataGridView.DataSource = MonDataSet
            Me.MonDataGridView.DataMember = "MaTable"

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Définir la position en fonction d'un critère
            With Me.MonDataGridView
                Dim cm As CurrencyManager = TryCast(.BindingContext(.DataSource, .DataMember), CurrencyManager)
                If cm Is Nothing Then
                    'Le DataGridView n'est lié à aucune source de données
                    Exit Sub
                Else
                    cm.Position = GetRowIndex(cm, "Nom", "er")
                End If
            End With

    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
    'Récupérer l'index en fonction d'un critère
        Private Function GetRowIndex(ByVal cm As CurrencyManager, ByVal nomColonne As String, ByVal critère As String) As Integer
            '
            'Cette méthode renvoie -1 si aucune ligne n'a pu être trouvée.
            'On suppose que la source de donnée est une DataTable ou un DataView et non un BindingSource.
            '
            Dim view As DataView = TryCast(cm.List, DataView)
            If view IsNot Nothing Then
                For Each prop As System.ComponentModel.PropertyDescriptor In cm.GetItemProperties()
                    If prop.Name = nomColonne Then
                        'On utilise view.Table.Compute pour récupérer la valeur complète du critère.
                        'On pourrait tout aussi bien utiliser view.Table.Select qui a l'avantage de renvoyer
                        'un tableau avec toutes les lignes correspondant aux critères.
                        Dim critèreComplet As Object = CStr(view.Table.Compute("Min(" & nomColonne & ")", nomColonne & " LIKE '%" & critère & "%'"))
                        If critèreComplet Is DBNull.Value Then Return -1
                        Return DirectCast(view, System.ComponentModel.IBindingList).Find(prop, critèreComplet)
                    End If
                Next
            End If
            Return -1
     
        End Function

    Pour convertir le code en C#, tu peux utiliser ceci : http://convertisseur.developpez.com/
    (\ _ /)
    (='.'=)
    (")-(")

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Merci pour toute ton aide, j'ai réussi à faire ce que je voulais en ajoutant un composant BindingSource.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/04/2014, 17h26
  2. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  3. [XL-2003] Modifier le le format Date sur toute les lignes d'une colonne
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/08/2010, 14h00
  4. Réponses: 4
    Dernier message: 17/04/2008, 13h19
  5. Réponses: 2
    Dernier message: 25/09/2006, 13h04

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