Dans Windows Forms (.NET 2.0, Visual Studio 2005 SP1): J'ai un DataSet
typé, avec une colonne de type System.Boolean
, qui est nullable et dont la valeur par défaut est DBNull
. J'ai un Form
, contenant un contrôle CheckBox
que je veux lier à la valeur de la colonne précédente.Comment lier un CheckBox à un DbColumn de type booléen nullable?
- J'ai essayé de lier la propriété
Checked
à la colonne via le concepteur: il fonctionne très bien, que si la valeur par défaut de la colonne est définie surTrue
ouFalse
. j'ai essayé de lier la propriété
CheckState
à la colonne par le concepteur, et fixer mes propres gestionnaires d'événementsFormat
etParse
mais ils ne sont jamais appelés:b.Format+=delegate(object sender, ConvertEventArgs cevent) { cevent.Value=DoFormat((CheckState)cevent.Value); // cf. end of the question }; b.Parse+=delegate(object sender, ConvertEventArgs cevent) { cevent.Value=DoParse(cevent.Value); // cf. end of the question };
J'ai essayé de créer une coutume
Binding
par exemple dans le code, veuillez joindre mes gestionnaires d'événements et l'ajouter auxCheckBox
fixations: les gestionnaires d'événements sont encore jamais appelés ... seBinding b=new Binding("CheckState", _BindingSource, "MyColumn", false, DataSourceUpdateMode.OnPropertyChanged, DBNull.Value);
À noter: une valeur DBNull
n'est acceptable que si elle provient du DataSet
(cela signifie que la valeur n'a jamais été définie). Mais l'utilisateur ne doit pouvoir définir que la valeur True
ou False
via le CheckBox
.
Pour référence, voici le code de l'analyse syntaxique et de formatage méthodes:
internal static CheckState DoParse(object value)
{
if ((value==null) || (value is DBNull))
return CheckState.Indeterminate;
bool v=Convert.ToBoolean(value);
return (v ? CheckState.Checked : CheckState.Unchecked);
}
internal static object DoFormat(CheckState value)
{
switch (value)
{
case CheckState.Checked:
return true;
case CheckState.Indeterminate:
return DBNull.Value;
case CheckState.Unchecked:
return false;
}
return null;
}
J'ai ajouté des informations sur ** pourquoi cela fonctionne * à la fin de ma réponse. –