Question

J'utilise Delphi 6 et je souhaite une zone de liste liée à la base de données avec multiselect. J'ai trouvé trois types de zones de liste: TListBox , TDBListBox et TDBLookupListBox .

Autant que je sache, TListbox n'est pas lié à la base de données. TDBListBox et TDBLookupListBox ne peuvent pas être multi-sélectionnés.

Existe-t-il un moyen de lier une zone de liste multisélection à la base de données?

Était-ce utile?

La solution

Le problème des composants de liaison de données est qu’ils reposent sur une source de données et qu’une source de données n’a qu’un seul curseur. C’est probablement la raison pour laquelle.

Au fait, avez-vous besoin de changer les données? Sinon, vous pouvez remplir une zone de liste normale à partir d'un jeu de données. Ou encore, utilisez une liste de données invisible et copiez le contenu dans une liste normale.

Autres conseils

Pas pour autant que je sache.
La norme est que vous proposez avec la liste un tas de valeurs dans lesquelles 1 représente l'enregistrement actuel.
Sauf si vous avez un champ à valeurs multiples (par rapport aux meilleures pratiques), je ne vois pas comment vous pourriez multi-sélectionner ...

Ou ce que vous voudrez peut-être est en fait une sous-table?

DevExpress TcxDBListBox prend en charge la sélection multiple. J'utilise leur case à cocher déroulante multisélection liée à une base de données, c'est gentil.

Les composants ont des méthodes que vous pouvez implémenter pour convertir votre liste vers et à partir de celle-ci; EditValueToStates et StatesToEditValue. Bien que les données que je stocke ne soient pas normalisées (je stocke une liste de numéros de version délimités par des points-virgules), j'ai créé un index de recherche en texte intégral sur le champ, avec un point-virgule comme séparateur et maintenant, je peux toujours effectuer des recherches optimisées. sur ce terrain.

Vous pouvez créer votre propre composant de zone de liste personnalisé descendant de TCustomListBox et ajouter une propriété Datasource pour votre liste et une autre propriété, telle que TStrings, à utiliser en tant que conteneur pour contenir les valeurs sélectionnées. Vous pouvez ensuite publier les modifications dans votre base de données à l'aide d'un clic de souris.

Si vous manipulez certaines des options d'un composant TDBGrid et limitez le nombre de colonnes qu'il affiche, vous pouvez créer quelque chose qui ressemble beaucoup à une zone de liste. Essayez de définir la propriété Options sur [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit, dgMultiSelect] et travaillez à partir de là.

Dans un TDbLookupListBox, vous avez la possibilité de lier deux choses différentes à des données; tout d'abord, vous pouvez lier la liste à un ensemble de données (ListSource / ListField / KeyField), ensuite vous pouvez lier l'élément sélectionné à un champ d'un autre ensemble de données (DataSource, DataField). Il n’ya rien de mal conceptuellement à vouloir lier la liste d’éléments à un jeu de données, puis à gérer manuellement plusieurs sélections. Cependant, je ne pense pas que cela soit possible avec l’implémentation actuelle sans sous-classement et activation des styles de contrôle requis.

Sur la base de votre commentaire à François, j'utiliserais une TListbox normale et écrirais du code pour insérer toutes les valeurs distinctes dans la liste, puis gérer vous-même les valeurs à sélection multiple. La solution de Jeremy fonctionne également et la DevExpress Express Quantum Grid dispose d'un système de filtrage efficace. pourrait même vous faire économiser une autre programmation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top