2011-09-23 6 views
0

J'utilise des unités TADOConn et TADODataSet tirant des données et connectées à TDataSources et TDBGrids. Mes DBGrids affichent correctement les informations et les informations d'édition dans la vue détaillée sont correctement reflétées dans la base de données de sauvegarde. Ce que je voudrais faire est de le faire afin qu'une mise à jour à un champ dans le détail DBGrid provoque une actualisation sur les deux ensembles de données afin que les données les plus à jour soient toujours affichées.Mise à jour de DBGrids dans les vues Master-Detail lors de la mise à jour des cellules dans Delphi

J'ai essayé de placer les appels d'actualisation dans plusieurs gestionnaires d'événements à différents niveaux d'accès à la base de données, mais ils semblent tous avoir un problème de réentrée similaire (mais différent).

Le meilleur que j'ai pu faire jusqu'à présent est de mettre à jour l'affichage maître en appelant l'actualisation de l'événement DBGrid.onColExit de détails.

Si je quitte l'actualisation des appels tous ensemble les informations mises à jour ne sont pas affichées jusqu'à la prochaine exécution de l'application.

Des idées sur la façon d'y parvenir? Est-ce que je vais à ce sujet le mauvais pourquoi? Merci d'avance.

Répondre

1

Vous impliquez que les modifications que vous apportez dans le DBGrid sont enregistrées dans la base de données, mais ne sont pas affichées dans la grille ou conservées dans son ensemble de données et que vous devez les récupérer dans la base de données. Tous les composants de jeu de données que j'ai utilisés conservent leur copie des données, y compris toutes les modifications qui ont été transmises à la base de données. Si vous pensez que les données peuvent être modifiées par des déclencheurs ou par un autre processus, vous devrez peut-être actualiser les données. Ensuite, vous devrez gérer la possibilité que la position d'enregistrement actuelle soit perdue, c'est-à-dire que l'enregistrement en cours a été supprimé dans la base de données.

J'essaierais d'utiliser l'événement Dataset.AfterPost pour lancer l'actualisation. Et je considérerais utiliser un Timer pour retarder l'actualisation si des choses étranges se produisent.

+0

Cela pourrait fonctionner, je vais essayer. La seule chose que je vois comme étant un problème est que quel que soit l'endroit où je place un retard, il sera toujours dans le même thread d'exécution qui a le problème de ré-entrant. Je posterai avec quelques résultats. – dpsthree

+0

L'un des objectifs de la minuterie est de briser la chaîne d'exécution qui pourrait entraîner des problèmes de rentrée. L'autre but est de permettre à d'autres choses de se produire avant l'actualisation, ce qui peut réduire le nombre d'actualisations nécessaires. – crefird

+0

Pas de chance, puisque la minuterie doit être déclenchée quelque part dans la chaîne du gestionnaire d'événements, nous retardons l'inévitable. La seule solution que j'ai pu trouver est un bouton de mise à jour autonome qui rafraîchit les deux ensembles de données indépendamment. – dpsthree

Questions connexes