2011-03-29 1 views
0

Dans Delphi 2007, j'ai un DBGrid. J'ai besoin de remplir un ComboBox lorsqu'une ligne dans le DBGrid est sélectionnée. Les données dans le ComboBox dépendent de la ligne sélectionnée et peuvent être différentes pour chaque ligne sélectionnée.Comment remplir une zone de liste déroulante lorsqu'une ligne dans un dbgrid est sélectionnée?

Le DBGrid contient des commandes de produits. Quand une commande est sélectionnée, j'ai besoin d'un ComboBox à remplir avec les numéros de lot du produit dans la commande. Ce numéro de lot est enregistré dans l'enregistrement de la commande, lorsque la commande est exécutée.

Je n'ai pas pu trouver d'événement onSelect ou onChange, que je pourrais utiliser pour cela.

Alors, comment puis-je faire cela?

+0

Est-ce une table de correspondance? Le contenu provient-il d'une autre table? Parce que c'est un scénario commun fourni par les contrôles sensibles aux données. –

+0

Oui, le contenu provient d'une autre table. Mais l'utilisation d'une LookupComboBox (recherche des numéros de lot à l'aide de l'id_produit) entraîne une liste déroulante où tous les éléments (numéros de lot) sont sélectionnés, car ils ont le même identifiant de produit. Et j'ai besoin d'un numéro de lot sélectionné, qui est stocké dans l'enregistrement de commande – mbriejer

Répondre

2

Vous devez utiliser l'événement TDataSet.AfterScroll

+0

+1 pour TDataSet. Dans ces scénarios, il est presque toujours préférable d'utiliser et de répondre à la source de données et à l'ensemble de données sous-jacents plutôt que de lutter avec les contrôles de l'interface graphique. –

+0

Salut, le TDataSet.AfterScroll fait l'affaire. Cependant, cela donne 2 problèmes. Premièrement, l'ensemble de données est défini dans un module de données. Donc, pour arriver à la combobox à partir de là est assez étrange. Deuxièmement, l'ensemble de données est également utilisé sur d'autres emplacements, pour lesquels je n'ai pas besoin de ce comportement. – mbriejer

+0

Si vous utilisez TDBComboBox, vous pouvez également placer son DataSet correspondant (ou ClientDataSet) dans DataModule et l'actualiser dans l'événement DataSet.OnAfterScroll de Grid. –

-1

Je suggère l'événement double clic (OnDblClick) pour attraper lorsque l'utilisateur clique avec sa souris et OnKeyPress pour la (= Key # 13) touche Entrée

+0

-1 Faire ceci par l'événement de la souris et du clavier deviendra rapidement un cauchemar et, je parie, 99% des fois auront _some fois _ quand le ComboBox n'est pas mis à jour correctement. – jachguate

1

Si Les données proviennent d'un DataSet dans un DataModule, car il ressemble à des commentaires à @Roman response, vous pouvez compter sur les événements TDataSource.

Si votre source de données se trouve également dans le module de données, vous pouvez placer un nouveau DataSource dans le formulaire lui-même (l'OMI est l'endroit auquel il appartient).

Ensuite, utilisez l'événement TDataSource.OnDataChange, de l'aide:

Ecrire un gestionnaire d'événements OnDataChange à prendre des mesures spécifiques lorsqu'un champ dans l'enregistrement en cours a été modifié et l'application se déplace vers un autre champ, ou lorsque le enregistrement actuel dans les modifications de jeu de données associées. OnDataChange est particulièrement utile dans les applications qui doivent synchroniser l'affichage des données dans les contrôles qui ne sont pas sensibles aux données. Cet événement est généralement utilisé pour s'assurer que le contrôle reflète les valeurs de champ actuelles dans l'ensemble de données, car il est déclenché par tous les changements.

Le paramètre Field est nil lorsque l'ensemble de données lié se déplace vers un nouvel enregistrement ou actualise un tampon d'enregistrement. Le champ n'est pas nul lorsque les modifications appartiennent à un champ particulier (un utilisateur ou le programme lui-même en changeant sa valeur).

Questions connexes