Partager via


Une grille basée sur un curseur est vide si la commande SELECT-SQL réinitialise le curseur dans Visual FoxPro

Cet article vous aide à résoudre le problème où la grille basée sur le curseur est vide si la commande SELECT-SQL réinitialise le curseur dans Visual FoxPro.

Version du produit d’origine : Visual FoxPro
Numéro de base de connaissances d’origine : 140653

Symptômes

Dans Microsoft Visual FoxPro, si la RecordSource propriété d’une grille est définie sur un curseur, puis que la commande SELECT-SQL réinitialise le curseur, la grille s’affiche vide si la propriété RecordSource n’est pas définie sur elle-même.

La commande suivante actualise correctement la grille si un SELECT-SQL est exécuté pour reconstruire le curseur, mais si les propriétés de colonne ou d’en-tête de la grille ont été personnalisées, ces modifications personnalisées sont perdues et les propriétés de colonne et d’en-tête de la grille revient à leurs paramètres par défaut :

 THISFORM.GRID1.RECORDSOURCE=THISFORM.GRID1.RECORDSOURCE

Cette personnalisation peut inclure des en-têtes portant différents noms, des colonnes plus longues et du code placé dans les événements de colonnes ou d’en-têtes. Pour plus d’informations, consultez l’article suivant dans la Base de connaissances Microsoft : 131836 PRB : Grille qui n’actualise pas l’affichage d’un curseur à partir d’une requête

La cause

Lorsque vous régénérez le curseur sur lequel la grille est basée avec la commande SELECT-SQL, le curseur d’origine doit être détruit avant la création du nouveau curseur. Lorsque cela se produit, les colonnes de la grille et les en-têtes sont également effacés, puis recréés. Même lorsque la RecordSource propriété de la grille est définie sur elle-même, les paramètres personnalisés des colonnes et des en-têtes de la grille sont perdus.

Résolution

Pour actualiser la grille sans perdre les propriétés personnalisées des colonnes et des en-têtes, définissez la RecordSource propriété sur un curseur factice qui a déjà été créé avec les mêmes champs que le curseur sur lequel la grille est basée. Une fois que le SELECT-SQL est exécuté, modifiez la propriété RecordSource pour qu'elle pointe de nouveau vers le curseur reconstruit. Cela permet aux propriétés des colonnes et des en-têtes de rester intacts pendant la reconstruction du curseur.

Statut

Ce comportement est intentionnel.

Plus d’informations sur les étapes à suivre pour reproduire le comportement

  1. Ouvrez la table Customer.dbf située dans le répertoire \Vfp\Samples\Data, puis créez un formulaire appelé GridForm.

  2. Placez le code suivant dans l’événement Load du formulaire :

     SELECT cust_id, city, country FROM customer INTO CURSOR Temp1
     SELECT cust_id, city, country FROM customer WHERE country = "" ;
     INTO CURSOR Temp2
    
  3. Placez le code suivant dans l’événement Destroy du formulaire :

     SELECT Temp1
     USE
     SELECT Temp2
     USE
    
  4. Placez une grille sur le formulaire et donnez à la grille les paramètres de propriété suivants :

     ColumnCount=3
     RecordSourceType=Alias
     RecordSource=Temp1
    
  5. Modifiez l'en-tête de grid1.Column1.header1 en ID client et la propriété de largeur de Column1 à 100.

  6. Ajoutez une zone de texte au formulaire.

  7. Ajoutez un bouton de commande et placez le code suivant dans son événement Click :

     THISFORM.GRID1.RECORDSOURCE = "Temp2"
     SELECT cust_id, city, country FROM customer ;
     WHERE country = Thisform.text1.value ;
     INTO CURSOR Temp1
     THISFORM.GRID1.RECORDSOURCE = "Temp1"
    
  8. Exécutez le formulaire. Tapez Espagne dans la zone de texte, puis cliquez sur le bouton de commande. La grille doit afficher tous les enregistrements où le champ pays est égal à l’Espagne. Le nom de l’en-tête de la colonne 1 reste le même et la largeur de la colonne ne change pas. En modifiant l’RecordSource de la grille au curseur appelé Temp2, les propriétés des colonnes et des en-têtes ne sont pas réinitialisées lorsque le curseur Temp1 est reconstruit.

  9. Modifiez les deux THISFORM.GRID1.RECORDSOURCE lignes de l’événement Click du bouton de commande en commentaires et ajoutez ce qui suit comme dernière ligne de code :

     THISFORM.GRID1.RECORDSOURCE = THISFORM.GRID1.RECORDSOURCE
    

Après avoir exécuté le formulaire, tapez un nom de pays dans la zone de texte, puis cliquez sur le bouton de commande, notez que le nom de la colonne change et que la largeur est plus petite.