In Windows Forms (.NET 2.0, Visual Studio 2005 SP1): Ich habe eine getippte DataSet
, mit einer Spalte, die System.Boolean
ist, die Nullable ist und der Standardwert ist DBNull
. Ich habe eine Form
, die ein CheckBox
Steuerelement enthält, das ich an den vorherigen Wert der Spalte binden möchte.Wie binden Sie eine CheckBox an eine bool-typisierte DbColumn, die keine NULL-Werte zulässt?
- Ich habe versucht, die
Checked
Eigenschaft auf die Spalte über den Designer zu binden: es funktioniert super, nur dann, wenn der Standardwert für die Spalte entwederTrue
oderFalse
gesetzt. Ich habe versucht, die
CheckState
Eigenschaft auf die Spalte über den Designer zu binden, und meine eigenenFormat
undParse
Event-Handler Anbringen aber sie nie aufgerufen: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 };
Ich habe
Binding
eine benutzerdefinierte zu schaffen versucht, Beispiel im Code, fügen sie meine Event-Handler und es dieCheckBox
Bindungen hinzufügen: die Event-Handler genannt noch nie bekommen ...Binding b=new Binding("CheckState", _BindingSource, "MyColumn", false, DataSourceUpdateMode.OnPropertyChanged, DBNull.Value);
Als ein Hinweis: ein DBNull
Wert ist nur akzeptabel, wenn aus dem DataSet
kommen (es bedeutet, der Wert wurde nie festgelegt). Der Benutzer sollte jedoch nur den Wert True
oder False
über die CheckBox
festlegen können.
Als Referenz hier ist der Code der Parsen und Formatierungsmethoden:
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;
}
Ich habe hinzugefügt Informationen über ** warum es * bis zum Ende meiner Antwort funktioniert. –