如何将可空的bool绑定到复选框?

时间:2012-04-27 20:16:11

标签: .net winforms nullable

我将信息显示为启用了ThreeState的复选框,并希望以最简单的方式使用可以为空的布尔值。

目前我正在使用嵌套的三元表达式;但有更明确的方式吗?

bool? foo = null;
checkBox1.CheckState = foo.HasValue ?
    (foo == true ? CheckState.Checked : CheckState.Unchecked) :
    CheckState.Indeterminate;

*请注意,复选框和表单是只读的。

3 个答案:

答案 0 :(得分:4)

我就是这样做的。

我会添加一个扩展方法来清理它。

    public static CheckState ToCheckboxState(this bool booleanValue)
    {
        return booleanValue.ToCheckboxState();
    }

    public static CheckState ToCheckboxState(this bool? booleanValue)
    {
        return booleanValue.HasValue ?
               (booleanValue == true ? CheckState.Checked : CheckState.Unchecked) :
               CheckState.Indeterminate;
    }

答案 1 :(得分:3)

更明确的是一个可论证的陈述。例如,我可以说这更清楚。

if(foo.HasValue)
{
    if(foo == true) 
       checkBox1.CheckState = CheckState.Checked;
    else
       checkBox1.CheckState = CheckState.Unchecked;
}
else
    checkBox1.CheckState  = CheckState.Indeterminate;

另一种选择是为此创建一个方法:

checkBox1.CheckState = GetCheckState(foo);

public CheckState GetCheckState(bool? foo)
{
    if(foo.HasValue)
    {
        if(foo == true) 
           return CheckState.Checked;
        else
           return CheckState.Unchecked;
    }
    else
        return CheckState.Indeterminate

}

但我喜欢你的代码。

答案 2 :(得分:0)

根据@ Nathan关于扩展方法的建议,我想出了这个:

public static void SetCheckedNull(this CheckBox c, bool? Value)
{
    if (!c.ThreeState)
        c.Checked = Value == true;
    else
        c.CheckState = Value.HasValue ?
            (Value == true ? CheckState.Checked : CheckState.Unchecked) :
            CheckState.Indeterminate;
}

我唯一不喜欢的是,在设置“普通”复选框时:

checkBox1.Checked = someBool;

设置启用ThreeState的复选框:

checkBox2.SetCheckedNull(someNullableBool);

后者只是感觉不同,它稍微调整了OCD。 :)

相关问题