布尔转换指定的转换无效错误

6

我目前将复选框的真/假状态存储在注册表中,以便下次加载表单时重置。

当加载表单时,我会获取该值并设置复选框,如下所示。

string value = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\CompanyName\AddressLoad", "SpaceBetween1", null);
if (value != null)
{
    if (value == "True")
    {
        checkBox1.Checked = true;
    } Else {
        checkBox1.Checked = false;
    }
}

这个可以用,但我觉得可能有更好的方法。
我试过这样:
checkBox1.Checked = (Boolean)Registry.GetValue(@"HKEY_CURRENT_USER\Software\CompanyName\AddressLoad", "SpaceBetween1", null);

但是它会报错"Specified cast is not valid."

该值在注册表中以REG_SZ的形式存储。不确定是否引起了问题。

enter image description here

我已经搜索了如何解决这个问题,但没有找到过这种情况。

有更好的方法将字符串值转换为布尔值并将其分配给复选框吗?


你可以尝试使用 bool.Parse 但我认为你会得到相同的错误。虽然我不确定。 - Joshua Bakker
@MatthewD 请阅读MSDN文档并尝试理解Registery.GetValue方法的作用。 - MethodMan
明白了。谢谢 Stack Overflow 的朋友们。 - MatthewD
4个回答

10

由于从注册表读取的值的类型是string,因此您无法进行强制转换。但是,您可以进行转换

checkBox1.Checked = Convert.ToBoolean(
    Registry.GetValue(
        @"HKEY_CURRENT_USER\Software\CompanyName\AddressLoad"
    ,   "SpaceBetween1"
    ,   null
    )
);

就这样了,谢谢。当它允许我时,我会将其接受为答案。 - MatthewD

8

使用 Convert.ToBoolean,因为 Registry.GetValue 将返回一个 object,如果它是类型为 bool 或包含字符串 true/false,则会得到结果。

例如:

object obj = "true";
bool b = (bool) obj; //This will fail
bool b2 = Convert.ToBoolean(obj); //This will work. 

它不会返回一个布尔值:它将返回一个字符串(在这种情况下),你需要以某种方式解析它作为布尔值。 - Gian Paolo
3
@GianPaolo,要使用“Parse”功能,您必须首先将其强制转换/转换为字符串。 “Convert.ToBoolean”可以避免这种情况。 - Habib
1
Convert.ToBoolean是一种从Registry.GetValue返回的对象进行“某种解析”的方法。实际返回的类型可以是字符串,就像这个例子中一样,也可以是数字(int?long?我应该检查),但无论如何都将是布尔值。Convert.ToBoolean可以处理字符串。 - Gian Paolo
1
@GianPaolo,您是在询问Convert.ToBoolean能否处理字符串值true/false吗?如果是的话,那么是可以的。 - Habib
1
@GianPaolo 不确定你是否投了反对票。但是除非你百分之百确定,否则不要投反对票。 - M.kazem Akhgary
@M.kazemAkhgary,我没有对任何评论/答案进行投票。 我不是在问,而是在说“true”“false”可以通过Convert.ToBoolean处理,这是我所说的解析的一种形式。由于GetValue()的结果基于注册表项上的类型返回一个类型,因此您必须以某种方式解析/转换它,而这种类型在任何情况下都将是布尔型。 - Gian Paolo


2

REG_SZ 是一个字符串。

在此基础上,你可以进行如下操作:

checkBox1.Checked = Registry.GetValue(@"HKEY_CURRENT_USER\Software\CompanyName\AddressLoad",
    "SpaceBetween1", null).ToString() == "True";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接