Comment se fait-checkedlistbox ne pas avoir la source de données ? comment lier une liste de valeurs?
Je suis en train d'élaborer un Winform et j'ai besoin d'une checkedlistbox. J'ai des valeurs stockées dans un objet qui a une propriété de Liste:
public static class Fields
{
public static IList<string> FieldList { get; set; }
static Fields()
{ ...//populate FieldList }
}
Maintenant, je voudrais que mon CheckedListBox utilisation de Champs.FieldList tant que source de données. Après une recherche en ligne j'ai trouvé que je devais définir
//in myForm_Load
mycheckedListBox.DataSource = Fields.FieldList;
Mais myCheckedListBox n'ont pas de propriété DataSource.
Suis-je manqué quelque chose?
OriginalL'auteur nche | 2011-11-21
Vous devez vous connecter pour publier un commentaire.
Par la documentation, il doit avoir cette propriété... http://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.datasource(SV.90).aspx
Cependant, j'ai aussi eu le même problème sur un projet pendant un certain temps, et utilisé cette CodeProject article de code de la solution dans un projet où j'ai besoin de cette fonctionnalité.
Des recherches un peu plus, j'ai trouvé ceci:
http://connect.microsoft.com/VisualStudio/feedback/details/115199/checkedlistbox-datasource-displaymember-valuemember-are-hidden
Edit: Le lien ci-dessus ne fonctionne plus, mais la exceprt ci-dessous est de l'article, qu'une fois y résidait.
Qui explique pourquoi la propriété existe, mais n'est pas afficher dans Intellisense.
Ce blog est intéressant à lire ainsi: http://waxtadpole.wordpress.com/2009/10/12/assigning-custom-class-to-checkedlistbox-datasource/
Ps: il n'y a pas de documentation sur la façon d'utiliser l'objet. Je suis nouveau sur winform dev (juste commencé aujourd'hui) donc, pourriez-vous me dire comment faire de cet article est disponible en VS designer?...
Je ne pense pas que vous pouvez, à moins que vous deviez créer votre propre classe qui remplace la CheckBoxList classe. Dans les projets les plus récents, je viens juste de ne pas avoir utilisé le contrôle, et plutôt utilisé un DataGridView dans les rares cas où j'ai besoin vraiment d'être en mesure de vérifier les éléments individuellement. Si votre source de données est un champ de bits, le DataGridView automatiquement le rendre comme un checkboxcolumn, et si non, je trouve qu'il eassier juste ajouter un DataColumn de type Boolean pour obtenir le même effet.
Même si elle va compiler, vous obtiendrez un runtime exception NullReferenceException lorsque vous essayez de définir la source de données.
Merci. J'ai édité la réponse, mais la citation de l'article est toujours d'actualité.
OriginalL'auteur
Ici est de savoir comment je suis, la liaison d'une
List<T>
deUser
objets dans CheckedListBox.Bien sûr ce n'est pas recommandé, puisque la documentation est de nous dire que cette propriété est caché.
Le code ci-dessus fonctionne, mais j'ai remarqué que certains des effets secondaires dans Visual Studio 2012, tels que:
Délai pour le rendu vérifié marqueur:
Après vous cliquez sur l'élément souhaité, il est gênant de retard pour rendre le "vérifié" marqueur.
Dans mon cas,
CheckOnClick
propriété est True,CausesValidation
est Faux.myCheckedListBox.Items.Add()
maintenant, puisque la solution de contournement ci-dessus est en agissant bizarre.OriginalL'auteur
Personnellement, j'utilise un
DataGridView
qui est lié à unDataTable
qui a un champ Booléen avec un champ pour la valeur d'affichage.Si vous masquer les en-têtes de colonne et de ligne des en-têtes, puis vous obtenez quelque chose d'assez proche de ce que l'un
CheckedListBox
vous donne.OriginalL'auteur
Cela peut être contourné en parcourant votre-être la source de données et en y ajoutant les éléments de l'un-à-un-temps. Par exemple:
Ce qui provoquera une exception:
Peut être modifié à ceci:
OriginalL'auteur
Je sais que c'est assez vieux, pour le bénéfice de quelqu'un qui a toujours la même exigence, voici ce qui a fonctionné pour moi. Notez que je n'ai pas utiliser
DisplayMember
ouValueMember
propriétés, comme il semble que c'est déconseillé (voir @David Stratton post ci-dessus).OriginalL'auteur
J'ai résolu le problème en changeant la méthode ToString () pour le nom qui doit apparaître:
et de se transformer en tableau liste avec les objets:
OriginalL'auteur