Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
Ouvrez la table Customer.dbf située dans le répertoire \Vfp\Samples\Data, puis créez un formulaire appelé GridForm.
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
Placez le code suivant dans l’événement Destroy du formulaire :
SELECT Temp1 USE SELECT Temp2 USE
Placez une grille sur le formulaire et donnez à la grille les paramètres de propriété suivants :
ColumnCount=3 RecordSourceType=Alias RecordSource=Temp1
Modifiez l'en-tête de grid1.Column1.header1 en ID client et la propriété de largeur de Column1 à 100.
Ajoutez une zone de texte au formulaire.
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"
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.
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.