2

我有一个查询,其结果看起来像

Blue
OrangeRed
Black
Green
Silver
Red

我打算从这个结果集中列出一个 System.Drawing.Color 对象。当我运行程序时,我得到了 InvalidCastException。所有这些颜色肯定都在 Color 的枚举中。为什么我会收到此异常?

private List<System.Drawing.Color> BuildColorList()
    {
        List<System.Drawing.Color>ColorList = new List<System.Drawing.Color>();
        using (SqlConnection con = new SqlConnection(cs))
        {
            using (SqlCommand cmd = new SqlCommand("select color from Colors", con))
            {
                con.Open();
                cmd.CommandType = CommandType.Text;
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    System.Drawing.Color color = (System.Drawing.Color)rdr["color"];
                    ColorList.Add(color);
                }
            }
            return ColorList;
        }
    }
4

5 回答 5

6

您不能进行强制转换:查询返回一个System.String不能直接强制转换为 a 的对象System.Drawing.Color。相反,您需要使用Color.FromName(string)方法:

private List<System.Drawing.Color> BuildColorList()
{
    List<System.Drawing.Color>ColorList = new List<System.Drawing.Color>();
    using (SqlConnection con = new SqlConnection(cs))
    {
        using (SqlCommand cmd = new SqlCommand("select color from Colors", con))
        {
            con.Open();
            cmd.CommandType = CommandType.Text;
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                System.Drawing.Color color = System.Drawing.Color.FromName((string)rdr["color"]);
                ColorList.Add(color);
            }
        }
        return ColorList;
    }
}
于 2013-06-13T18:39:44.180 回答
2

替换这个

System.Drawing.Color color = (System.Drawing.Color)rdr["color"];

有了这个

 System.Drawing.Color color =Color.FromName((string)rdr["color"]);
于 2013-06-13T18:40:49.093 回答
1

您不能只将字符串(这是从数据库查询返回的内容)转换为System.Drawing.Color.

相反,您应该使用类似的东西System.Drawing.Color.FromName()来解析颜色:

System.Drawing.Color color = 
    System.Drawing.Color.FromName(rdr["color"] as string);
于 2013-06-13T18:38:41.957 回答
1

而不是使用该FromName方法进行强制转换;

System.Drawing.Color color = Color.FromName(rdr["color"]);

会做你想做的。

于 2013-06-13T18:40:37.117 回答
0

尝试

System.Drawing.Color color = Color.FromName( (string)rdr["color"] );
于 2013-06-13T18:40:40.710 回答