Jak powiązać CheckBox z DbColumn typu bool, który jest pusty?

W Windows Forms (.NET 2.0, Visual Studio 2005 SP1): Mam wpisanyDataSet, z kolumną, która jest typemSystem.Boolean, która jest pusta i której wartością domyślną jestDBNull. mamForm, zawierający aCheckBox kontrola, którą chcę powiązać z poprzednią wartością kolumny.

Próbowałem związaćChecked właściwość do kolumny za pośrednictwem projektanta: działa świetnie, tylko jeśli domyślna wartość kolumny jest ustawiona na alboTrue lubFalse.

Próbowałem związaćCheckState własność do kolumny za pośrednictwem projektanta i dołączanie własnychFormat iParse obsługa zdarzeń, ale nigdy się nie nazywa:

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
};

Próbowałem stworzyć niestandardowyBinding wystąpienie w kodzie, dołącz moje programy obsługi zdarzeń i dodaj je doCheckBox powiązania: programy obsługi zdarzeń wciąż nie są wywoływane ...

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

Jako notatkę: aDBNull wartość jest akceptowalna tylko wtedy, gdy pochodzi zDataSet (oznacza to, że wartość nigdy nie została ustawiona). Ale użytkownik powinien mieć możliwość ustawienia wartości tylko naTrue lubFalse za pośrednictwemCheckBox.

Dla odniesienia, oto kod metod parsowania i formatowania:

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;
}

questionAnswers(2)

yourAnswerToTheQuestion