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 6 et antérieur Discussion :

MSHFLEXGRID : Le numéro de la ligne sélectionnée ROWSEL est décalé de 1


Sujet :

VB 6 et antérieur

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut MSHFLEXGRID : Le numéro de la ligne sélectionnée ROWSEL est décalé de 1
    Bonjour, je viens de tomber sur un dysfonctionnement lors de l'utilisation d'un controle MSHFLEXGRID lié à un controle ADO;
    ce dysfonctionnement est assez difficile à expliquer et j'ai mis de très nombreuses heures pour comprendre ce qu'il se passe

    J'utilise ma FLEXGRID avec une ligne de "titre" et j'ai donc paramétré la propriété FIXEDCOL à 1

    Dans ces conditions, lorsque j'affiche des données via un select et un refresh
    et que je clique sur la première ligne de données, la propriété ROWSEL est à 1, pour la ligne suivante ROWSEL est à 2 ce qui est normal;

    Le dysfonctionnement intervient dans le cas où le SELECT qui sert à remplir la GRID ne renvoie aucune ligne (ce qui peut arriver si la clause WHERE du SELECT est fort restrictive); le REFRESH se passe correctement et la GRID n'affiche que la ligne de titre

    SI, après cet affichage vide, on effectue à nouveau un SELECT/REFRESH qui retourne des lignes, alors, (et c'est la le dysfonctionnement), la propriété ROWSEL de première ligne de données n'est plus à 1 mais à 0....; la seconde ligne est à 1

    Vous trouverez ci dessous le code permettant de tester cette anomalie; le projet VB et sa base de test sont également en pièce jointe.

    Sans modifier le code VB, en cliquant sur la première ligne de données, ROWSEL sera à 0
    Si ensuite, vous mettez en commentaire le premier ordre refresh, et que vous cliquez sur la première ligne le ROWSEL sera à 1

    Tout ceci entraine pas mal de soucis dans mes développements puisque le numéro de ligne n'est pas toujours le même.....

    Je vous remercie par avance de l'aide que vous pourrez m'apporter
    PHILIPPE

    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
    Private Sub Form_Load()
    Dim varparbal As String
    Dim varbasloc As Database
    Dim vartrasql As Recordset
    ' ouverture base
    varparbal = "C:\base.accdb"
    Set varbasloc = OpenDatabase(varparbal)
    ' select ne retournant aucune ligne
    Form1.formado.RecordSource = "SELECT col1, col2 FROM table1 where col1=""VALEUR IMPOSSIBLE"""
    Form1.formado.Refresh
    ' select retournant toutes les lignes
    Form1.formado.RecordSource = "SELECT * FROM table1"
    Form1.formado.Refresh
    Form1.formgrid.FormatString = "colonne1|colonne2"
    End Sub
    Private Sub formgrid_Click()
    MsgBox Form1.formgrid.RowSel
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    Dans MSDN

    ColSel, RowSel, propriétés
    ...
    Lorsque vous définissez les propriétés Row et Col, RowSel et ColSel sont automatiquement redéfinies, de sorte que le curseur devienne la sélection en cours. Pour sélectionner un bloc de cellules à partir du code, vous devez dans un premier temps définir les propriétés Row et Col, puis définir RowSel et ColSel.
    Après un affichage vide, les propriétés Row et Col sont remises à 0 donc ...
    Redefinir les propriétés Row et Col après l'affichage vide.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci d'avoir pris le temps de me lire

    en fait mon problème n'est pas un problème pour définir la sélection en cours via rowsel et colsel

    mais de récupérer le numéro de la ligne selectionnée lorsque l'on clique sur une ligne

    comme expliqué, précédemment, ce numéro varie de 1 suivant que l'on a ou pas rempli la flexgrid à vide dans un affichage précédent

    s'il n'y a jamais eu d'affichage vide, alors la première ligne de données est la 1;
    s'il y a eu un affichage vide, suivi d'un affichage non vide, sur ce dernier affichage, la première ligne de données est la 0; ce qui en l'occurence est le même numéro que la ligne de titre et cela pose plein de pbs

    ceci d'autant que je mémorise ce numéro de ligne pour le passer de page en page

    Bonne journée à mes lecteurs

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    Essaie ceci

    Dans ta table1, tu crées un champ numérique appelé bidon (par ex), il sera initialisé à 0 et une variable drapeau.

    Dans ta requète tu places le champ bidon et tu initialises Bidon à 1 juste avant ta requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bidon = 1
    Form1.formado.RecordSource = "SELECT col1, col2, bidon FROM table1 where coll1=""VALEUR IMPOSSIBLE"""
    drapeau = bidon
    Tu testes alors ta variable drapeau:

    1.Si requète vide alors drapeau =1

    2.Si données dans ta requète alors drapeau = 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    If drapeau = 0 then
         Form1.formado.Refresh
         Form1.formgrid.FormatString = "colonne1|colonne2"
    End If

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Iclic,
    je ne comprends pas votre réponse qui n'est pas en rapport avec le dysfonctionnement de la valeur retournée quand on clique sur une ligne d'une flexgrid
    si vous avez un peu de temps pour tester le programme vb que j'ai joint avec une base de test, peut être pourriez vous apréhender le vrai soucis
    Merci d'avance

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Désolé fiboc, mais je ne sais pas lire ta Database car elle n'est pas reconnue et provoque une erreur.

    La réponse que je te donnais c'était pour essayer de contourner ton "dysfonctionnement"

    A+

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour iclic
    je viens de regenerer la base au format access 2000
    la précédente était en 2007; les fichiers sont joints
    le pb est le même
    Merci de ton aide
    Fichiers attachés Fichiers attachés

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Citation Envoyé par filboc Voir le message
    Dans ces conditions, lorsque j'affiche des données via un select et un refresh
    et que je clique sur la première ligne de données, la propriété ROWSEL est à 1, pour la ligne suivante ROWSEL est à 2 ce qui est normal;

    Le dysfonctionnement intervient dans le cas où le SELECT qui sert à remplir la GRID ne renvoie aucune ligne (ce qui peut arriver si la clause WHERE du SELECT est fort restrictive); le REFRESH se passe correctement et la GRID n'affiche que la ligne de titre

    SI, après cet affichage vide, on effectue à nouveau un SELECT/REFRESH qui retourne des lignes, alors, (et c'est la le dysfonctionnement), la propriété ROWSEL de première ligne de données n'est plus à 1 mais à 0....; la seconde ligne est à 1
    Effectivement, j'avais testé et j'avais bien ce comportement.
    Une bidouille pas très jolie, mais si cela fonctionne.
    Au début sur le Form_Load vous faites un select restrictif qui va décaler vos numéros de ligne, puis ensuite le select normal.
    Ainsi ensuite vous serez toujours avec la propriété ROWSEL à 0 pour tous les select suivant.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour fiboc,

    Où alors tu fais ceci:

    1.Ajoute un champ à ta table (qui sera vide)

    Ensuite tu testes le nombre de colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim NbreCol as long
    '...
    Form1.formado.RecordSource = "SELECT col1, col2 FROM Table1 where col1=""VALEUR IMPOSSIBLE"""
    Form1.formado.Refresh
    NbreCol = formgrid.Cols
     'select retournant toutes les lignes
    Form1.formado.RecordSource = "SELECT * FROM Table1"
    Form1.formado.Refresh
    If NbreCol = 2 Then formgrid.FixedRows = 0
    Form1.formgrid.FormatString = "colonne1|colonne2"
    NbreCol = formgrid.Cols
    Si tu as passé par des valeurs vides le nombre de colonnes vaudra 2,
    sinon 3

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour fiboc,

    Un petit changement...

    Dans ton test,

    Dans ta base de test et dans ta Table1 ,tu ajoutes un champ ( Col3 ) de longueur 1

    Sur ta form1 tu places deux boutons de commande ( Command1,Command2 )

    et tu ajoutes les procédures suivantes et tu testes sur le nombre total de champs ( ici 3 )
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Dim NbreCol As Long
    Private Sub Form_Load()
    Dim varparbal As String
    Dim varbasloc As Database
    Dim vartrasql As Recordset
     
    Command1.Caption = "Sélection"
    Command2.Caption = "Pas de sélection"
    ' ouverture base
    varparbal = "C:\testvb\base.mdb"
    Set varbasloc = OpenDatabase(varparbal)
    End Sub
    Private Sub formgrid_Click()
     MsgBox Form1.formgrid.RowSel
    End Sub
    Private Sub Command1_Click()
    ' select retournant toutes les lignes
    Form1.formado.RecordSource = "SELECT * FROM table1"
    Form1.formado.Refresh
    NbreCol = formgrid.Cols
    If NbreCol = 3 Then
        formgrid.FixedRows = 0
        Form1.formgrid.FormatString = "colonne1|colonne2"
        formgrid.FixedRows = 1
    End If
    End Sub
    Private Sub Command2_Click()
    ' select ne retournant aucune ligne
    Form1.formado.RecordSource = "SELECT col1, col2 FROM table1 where col1=""VALEUR IMPOSSIBLE"""
    Form1.formado.Refresh
    NbreCol = formgrid.Cols
    If NbreCol = 3 Then
        formgrid.FixedRows = 0
        Form1.formgrid.FormatString = "colonne1|colonne2"
        formgrid.FixedRows = 1
    End If
    End Sub
    ... et tu démarres chaque fois à 1

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci à hervé et iclic pour votre aide
    les 2 solutions fonctionnent : SUPER

    néanmoins, c'est quand même dingue ce bug
    et ce d'autant qu'avec une MSFLEXGRID (sans le H) je n'ai aucun problème mais ce controle n'est pas supporté apparement en access 2007

    A bientot
    Philippe

  12. #12
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Hello, je viens de creuser encore un peu la méthode de iclic et en fait, juste en ajoutant les 4 lignes ci dessous au programme original, on règle le pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    formgrid.FixedRows = 0
    if formgrid.rows > 1 then
       formgrid.FixedRows = 1
    end if
    quelqu'un comprend il pourquoi ?

  13. #13
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Je viens de survoler la liste des messages. J'aurais été tentée de te dire de tester le résultat de la requête (résultat nul) afin de gérer ce cas ou de vérifier si ta ligne de titre n'interférait pas, par le plus grand des hasard, sur l'affichage (ou le décompte) du résultat, mais je vois que c'est la seconde solution que tu as choisi et qui semble fonctionner. Du moins, si j'ai bien compris.

    De toutes manières, je n'aurais pas pu tester chez moi, je ne lis pas les bases de données dans mon petit vase clos.

    Bon, et bien, si tout fonctionne comme tu veux, n'oublies pas de cliquer sur

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

Discussions similaires

  1. numéro ligne sélectionné datagridview
    Par oami89 dans le forum VB.NET
    Réponses: 5
    Dernier message: 26/03/2011, 00h54
  2. Récupérer le numéro de la ligne sélectionnée dans une variable?
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/10/2007, 11h48
  3. [xml] Récupérer le numéro de la ligne d'erreur d'un fichier
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 7
    Dernier message: 20/03/2004, 19h09
  4. ListBox : récupération du numéro de la ligne
    Par Argonz dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/11/2003, 08h17
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

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