Comment puis-je utiliser la liaison de données avec Windows Forms boutons radio?
J'ai un champ binaire dans ma base de données qui est difficile à décrire, dans une INTERFACE utilisateur à l'aide d'un seul "Est XXXX?"-type de case à cocher. Je préfère utiliser une paire de boutons radio (par exemple, "Faire de la Foo" et "Faire de la Barre de chemin"), mais pour l'instant, tous les autres champs de mon formulaire sont liés aux données d'un objet métier. J'aimerais données-lier la paire de boutons radio à l'objet de l'entreprise, mais ne viens pas avec une bonne façon de le faire encore. Je peux lier l'un des boutons pour le domaine, tels que le champ a la valeur "true" si le bouton est sélectionné, mais tout en sélectionnant le bouton autre ne dé-sélectionnez le premier (qui est, les deux boutons radio sont correctement appariés), la valeur du champ n'est pas à jour pour refléter cela.
Je voudrais être en mesure de dire
button1.DataBindings.Add(new Binding("checked", source, "useFoo"));
button2.DataBindings.Add(new Binding("checked", source, "!useFoo"));
mais je suis certain que cela va les jeter lorsqu'il s'exécute. Est-il un moyen plus facile, ou devrais-je simplement mettre plus de pensée dans la façon dont à la parole une seule case? Je ne veux pas d'ajouter des fonctions supplémentaires à gérer quelque chose d'aussi trivial...
ETA: UN intervenant a suggéré d'examiner une liste déroulante (ComboBox). J'avais pensé à ce sujet, mais comment aurais-je de données-lier à un champ booléen dans une base de données de la Propriété à un objet métier? Si je la lie de la SelectedItem à la useFoo de la propriété, ce serait aller dans la collection d'Éléments? Aurais-je dû ajouter "Vrai" et "Faux", ou pourrais-je en quelque sorte ajouter une paire clé/valeur de l'objet qui lie un élément affiché ("Utilisation Foo" /"Ne Pas Utiliser de Foo") à la valeur booléenne derrière elle? Je vais avoir du mal à trouver des docs sur ce.
À propos de la réponse: la solution que j'ai liquidé l'aide d'impliquer la modification de l'objet de l'entreprise -- l'idée de base est très similaire à celui posté par Gurge, mais j'ai trouvé séparément avant j'ai lu sa réponse. En bref, j'ai ajouté une propriété séparée, qui renvoie simplement !useFoo
. Un bouton radio est lié à source.UseFoo
, et l'autre est lié à source.UseBar
(le nouveau nom de la propriété). Il est important de s'assurer que la nouvelle propriété possède à la fois des getters et setters, ou vous vous retrouverez avec vraiment un comportement étrange.
OriginalL'auteur Coderer | 2008-12-05
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé un moyen de le faire à l'aide de DataSet/DataTable.
Je fais une colonne calculée dans la DataTable avec l'expression
IIF(Foo=true, false, true)
. Appelons cette colonneBar
.Bar
est de type Booléen. Maintenant, vous pouvez lier uneRadioButton.Checked
àFoo
et un àBar
.Pour obtenir
Bar
cochant/décochant à propager retour àFoo
vous devez aller à la générées DataTable code et ajouter une ligne, la dernière dans cet exemple:OriginalL'auteur Guge
RadioButton
qui est directement liée à votre valeur booléenne (c'est à dire est vérifiée lorsque la valeur esttrue
).Ajouter un gestionnaire d'événements pour l'
CheckedChanged
événement sur ceRadioButton
qui se présente comme suit :OriginalL'auteur Mac
Si votre entreprise objet implémente INotifyPropertyChanged (ce qui rend la liaison travail plus agréable), vous pouvez ajouter le code suivant à l'interface visuelle où
BO
est votre entreprise objet est déclaré withevents etBO.Value
est la propriété booléenne que vous souhaitez lier à.Suivantes liaisons accrocher les boutons radio.
Visual interface doit implémenter INotifyPropertyChanged. Cette méthode fonctionne dans les deux sens: la valeur d'origine est mis à jour si les modifications de l'interface et si la valeur d'origine des modifications de l'interface est mise à jour correctement.
OriginalL'auteur
Je suis tombé sur le même problème, et a découvert qu'il est possible avec le standard de liaison de données:
Par défaut,
DataSourceUpdateMode
est fixé àOnValidation
. En le définissant parOnPropertyChanged
, la modification est propagée immédiatement à l'objet lié aux données.Mon entreprise objet implémente
INotifyPropertyChanged
;Par le test de cette solution, j'ai découvert que mon
OnPropertyChanged
événement a été déclenché deux fois quand j'étais en cliquantbutton2
. Pour éviter cela, il suffit de définircomme illustré ici:
TextBox laisser causes PropertyChanged virer deux fois
OriginalL'auteur vi3x
Le faire manuellement dans le code. Lorsque vous chargez le formulaire de régler votre radio-boutons en fonction de votre base de données. Lorsque vous appuyez sur un bouton "enregistrer" magasin de l'etat comme vous le souhaitez. Cet exemple magasins de radios que de champs de bits dans la base de données.
-
J'ai essayé de faire glisser des éléments à partir de "Sources de Données" panneau de configuration de Visual Studio 2015, lorsque j'ai défini mes boutons radio comme des booléens dans le tableau, mais il y a des problèmes avec les booléens ne pas être mis à jour à false quand un autre bouton radio est sélectionné. Lors de la modification de la "causesValidation" false radiobuttons désactivée automatiquement lorsque le saut entre les autres champs de saisie de texte.
OriginalL'auteur Pete
Vous ne devriez avoir à se lier l'un des contrôles aussi longtemps que vous vous assurez qu'ils sont dans le même groupe.
Vous pourriez aussi envisager une liste Déroulante.
OriginalL'auteur Excel Kobayashi