Wie binde ich eine CheckBox an eine bool-typisierte DbColumn, die nullwertfähig ist?

In Windows Forms (.NET 2.0, Visual Studio 2005 SP1): Ich habe eine eingegebenDataSet, mit einer Spalte, welche Art istSystem.Boolean, was nullbar ist und welcher Standardwert istDBNull. Ich habe einFormmit aCheckBox steuern Sie, dass ich an den vorherigen Spaltenwert binden möchte.

Ich habe versucht, die zu bindenChecked Eigenschaft für die Spalte über den Designer: Es funktioniert hervorragend, nur wenn der Standardwert für die Spalte auf entweder festgelegt istTrue oderFalse.

Ich habe versucht, die zu bindenCheckState Eigenschaft an die Spalte über den Designer, und meine eigenen anfügenFormat undParse Event-Handler, die aber nie aufgerufen werden:

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 versucht, eine benutzerdefinierte zu erstellenBinding Beispiel im Code, hängen Sie meine Event-Handler an und fügen Sie es dem hinzuCheckBox Bindings: Die Event-Handler werden noch nie aufgerufen ...

Binding b=new Binding("CheckState", _BindingSource, "MyColumn", false, DataSourceUpdateMode.OnPropertyChanged, DBNull.Value);

Als Hinweis: aDBNull Der Wert ist nur dann akzeptabel, wenn Sie von derDataSet (es bedeutet, dass der Wert noch nie eingestellt wurde). Der Benutzer sollte jedoch nur in der Lage sein, den Wert auf festzulegenTrue oderFalse über dieCheckBox.

Als Referenz finden Sie hier den Code der Analyse- 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;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage