2010-06-29 14 views
2

J'ai obtenu un dbGrid avec X lignes. Je souhaite mettre à jour une valeur de champ dans la deuxième ligne avec un temporisateur (par exemple, afficher un compte à rebours). Ce n'est pas un problème, mais je veux être en mesure de changer la ligne sélectionnée et continuer à mettre à jour la deuxième rangée. Lorsque la sélection change dans la grille, l'enregistrement en cours de l'ensemble de données connecté change également, ce qui pose un problème car le code de la minuterie pointe vers l'enregistrement sélectionné.Delphi - Mettre à jour le champ dans un dbGrid alors que la sélection est sur une autre ligne

Comment cela pourrait-il être résolu? Merci!

Répondre

4

Si l'ensemble de données connecté à dbGrid est TClientDataSet, vous pouvez supprimer un autre fichier TClientDataSet et cloner les données de l'ensemble de données de la grille.

Étant donné que les deux ensembles de données pointent vers les mêmes données, vous pouvez modifier les valeurs dans l'ensemble de données cloné et ces données s'afficheront dans dbGrid sans altérer l'ensemble de données dbGrids.

+1

+1. @doubleu Si vous ne savez pas comment utiliser les curseurs clonés dans ce scénario, consultez http://www.codegearguru.com/video/049/CloneCursor.html C'est un bon moyen de comprendre l'utilisation du clonage. –

+0

Salut et merci fory vos réponses. Mais j'ai quelques questions concernant ce problème ... J'ai une structure comme ceci: DataSource -> ClientDataSet et ClientDataSetClone -> DSProvider -> TQuery. Question1: Lorsque j'insère de nouveaux enregistrements, dois-je les insérer via clientDataSet (puis utiliser applyUpdates), ou dois-je utiliser le TQuery directement - ou n'est-ce pas important? Question2: Lorsque j'utilise clientDataSet pour insérer un enregistrement, ce nouvel enregistrement est toujours le dernier enregistrement dans le dbgrid. Comment pourrais-je l'insérer en haut? Merci pour votre aide et désolé pour mes questions idiotes. – doubleu

+0

Répondre à moi-même :) Je pense que je devrais utiliser le clientDataSet pour insérer de nouveaux enregistrements. Après applyUpdates, j'appelle tquery.refresh pour incruster le contenu entre les données dans le TQuery et le ClientDataSet. Cela résout également mon deuxième problème: Lorsque j'appelle d'abord tquery.refresh puis que j'insère un nouvel enregistrement dans mon clientDataSet, c'est le premier enregistrement de la grille. Si je fais des erreurs évidentes, s'il vous plaît faites le moi savoir. Merci à vous les gars, vous et stackoverflow sont géniaux;) – doubleu

0

Essayez cette approche très simple:

if DataSource1.DataSet.State in dsEditModes then 
    DataSource1.DataSet.Post; { or Cancel, depends on your needs } 
try 
    DataSource1.DisableControls; 
    Bookmark := ClientDataSet1.GetBookmark; 
    try 
    if ClientDataSet1.Locate(SecondRowId, 'Id', []) then 
    begin 
     ClientDataSet1.Edit; 
     ClientDataSet1['Counter'] := Counter; 
     ClientDataSet1.Post; 
    end; 
    ClientDataSet1.GotoBookmark(Bookmark); 
    finally 
    CLientDataSet1.FreeBookmark(Bookmark); 
    end; 
finally 
    DataSource1.EnableControls; 
end;