Delphi - restaurer la ligne réelle dans le DBGrid
D6 prof.
Auparavant, nous avons utilisé DBISAM et DBISAMTable. Gérer le RecNo, et il fonctionne bien avec des modifications (Supprimer, modifier, etc).
Maintenant, nous avons remplacé avec ElevateDB, qui ne gèrent pas RecNo, et de nombreuses fois, nous utilisons des Requêtes, pas de Tables.
Requête doit rouvrir pour voir les modifications.
Mais si nous rouvrons la Requête, nous avons besoin d'un repositionnement sur le dernier enregistrement.
Recherchez n'est pas suffisant, parce que la Grille est de l'afficher dans une autre Ligne.
Ce qui est très inquiétant, car après la modification de l'enregistrement est en mouvement dans une autre ligne, vous êtes dur à suivre, et les utilisateurs de la haine.
Nous avons trouvé ce code:
function TBaseDBGrid.GetActRow: integer;
begin
Result := -1 + Row;
end;
procedure TBasepDBGrid.SetActRow(aRow: integer);
var
bm : TBookMark;
begin
if IsDataSourceValid(DataSource) then with DataSource.DataSet do begin
bm := GetBookmark;
DisableControls;
try
MoveBy(-aRow);
MoveBy(aRow);
//GotoBookmark(bm);
finally
FreebookMark(bm);
EnableControls;
end;
end;
end;
L'exemple d'origine est utilise moveby. Cela fonctionne bien avec des questions, parce que nous ne pouvons voir que la Requête a rouvert en arrière-plan, le contrôle visuel n'est pas modifié la position de ligne.
Mais quand nous avons EDBTable, ou Vivre et Sensible à la Requête, le MoveBy est dangereux à utiliser, parce que si quelqu'un de supprimer ou d'ajouter une nouvelle ligne, nous pouvons nous déplacer dans l'enregistrement incorrect.
Puis j'ai essayé d'utiliser le Signet (voir remarque). Mais cette technique ne fonctionne pas, parce que c'est de montrer à l'enregistrement dans une autre position de Ligne...
Donc la question: comment faire pour forcer la position de ligne et d'enregistrer dans le DBGrid?
Ou ce genre de DBGrid pouvez la déplacer à l'enregistrement/la ligne après le DataSet sous-jacent actualisé?
Je recherche de solution conviviale, je les comprends, parce que j'ai essayé d'utiliser ce saut-sur DBGrid, et très mauvais pour l'utiliser, parce que mes yeux vont sortir lorsque vous essayez de trouver l'enregistrement d'origine après la mise à jour... 🙁
Merci pour votre aide, liens, infos:
dd
OriginalL'auteur durumdara | 2010-06-08
Vous devez vous connecter pour publier un commentaire.
Depuis MoveBy sont là pour vous d'utiliser.
Obtenir un "Signet" avant la fermeture de l'ensemble de données. Faire votre travail, de rouvrir le jeu de données, puis de repositionner votre dossier sur la grille avec le 'MoveBy. Lorsque vous avez terminé, obtenir un autre Signet et de la comparer avec la précédente, avec un jeu de données.CompareBookmarks. Si le résultat est 0 fine, si pas, alors seulement question d'un "GotoBookmark" pour le signet précédent.
De cette façon, tant qu'un autre utilisateur ne l'ont pas supprimé/enregistrements insérés votre grille ne sera pas semblent être nerveux, et si ce n'est pas le cas, au moins tu serais sur le même registre.
edit: Voici un exemple de code qui devrait repositionner l'enregistrement sélectionné dans le bon lieu, même lorsqu'il y a eu des suppressions/insère dans le jeu de données. Notez que le code omet désactivation/activation des contrôles, et le cas particulier où il y a moins de dossiers à remplir la grille pour des raisons de simplicité.
OriginalL'auteur Sertac Akyuz
Stocker la valeur(s) de votre champ de clé unique(s) avant la fermeture et de la réouverture de la requête, puis
Locate
à l'enregistrement, après la réouverture.DisableControls
/EnableControls
pour empêcher les mises à jour d'écran.L'utilisateur 2 Insérer/Supprimer une ligne, et votre Utilisateur 1 enregistré recordnumbers sera incorrect. C'est ce que TOndrej est d'essayer de vous aider à éviter.
OriginalL'auteur Ondrej Kelle
Qu'un simple morceau de code qui est venu dans mon esprit:
Ce DBGrid utilisez-vous? Standard TDBGrid n'a pas de propriété GetRow. Je doute que cela soit DBGrid problème. DBGrid active de l'enregistrement est actif en cours d'enregistrement dans le jeu de données.
OriginalL'auteur Linas
De position de l'enregistrement dépend beaucoup de l'ordre de tri de jeu de résultats que vous avez obtenu à partir de la Requête/objet de la Table.
Si vous n'avez pas d'ordre à tous, l'ordre que vous obtenez à partir du serveur de mise en œuvre est définie et telle, ne peut pas garantir que les enregistrements de venir dans le même ordre lors de la réouverture de la requête, même si aucun changement n'est arrivé. Au moins dans MSSQL et Firebird, les résultats viennent dans différentes commandes si aucune Commande Par clause est utilisée.
Comme pour le repositionner, je pense que TOndrej solution la plus sûre est d'une aide de la clé primaire de votre jeu de résultats pour repositionner la grille sur le droit d'enregistrement.
OriginalL'auteur Fabricio Araujo