使用数据库存储和检索颜色,在C# Windows窗体应用程序中。

9

我正在使用C#制作一个Windows应用程序。我使用颜色对话框让用户选择颜色。我想将该颜色存储在数据库中,并能够在以后检索它,以便在用户界面中使用该颜色。

你会建议我采取什么样的方法呢?


你已经有一个用于此应用程序的数据库了吗? - Raj More
4个回答

13
最好的方法是将十六进制颜色值存储在数据库字段nvarchar(7)中......例如,输入可能为#ffffff。使用varchar(6)同样可行,并且在您的数据库中占用更少的空间。只需确保在代码中附加#
由于您需要将其转换为/从控件颜色,因此可以使用System.Drawing.ColorTranslator.FromHtml(someHexColor)
// Hex to Control Color
var myColor = "#[color from database]";
var myControlColor = System.Drawing.ColorTranslator.FromHtml(myColor);

// Control Color to Hex
var colorBlue = System.Drawing.Color.Blue;
var hexBlue = System.Drawing.ColorTranslator.ToHtml(colorBlue);

2
+1 - 尽管我认为 varchar 足以满足你对 RGB 值的 Unicode 无忧需求。 - CAbbott
@Jeffrey,除了你担心这种类型的数据填满数据库之外,你一定是在处理大量记录。SQL Server Express将在nvarchar(7)上达到数据大小底线之前达到其记录数限制。而SQL Server Standard没有这些任意限制,硬盘空间非常便宜! - Chase Florell
这种方法不能提供一致的结果。ToHtml有时会返回十六进制值,有时会返回颜色的名称(取决于是否有可用的名称)。虽然我确信FromHtml都能正确翻译,但是你会失去与存储在数据库中的值的一致性,更不用说一些颜色名称超过7个字符了。 - musefan
透明度怎么办?我也使用这种方法。但现在我想要存储颜色的 Alpha 值,而 ColorTranslator 不支持。 - Mahmood Dehghan
@Mahmoodvcs 我会在表格中单独设置一个alpha字段,并在代码中检查其是否为空。 - Chase Florell
显示剩余9条评论

5
我使用 System.Drawing.Color.FromArgb() 和 System.Drawing.Color.ToArgb() 函数将颜色从整数转换为颜色,再将其作为 int 类型保存在数据库中。

这也是一种不错的方法,但是我更倾向于能够查看数据库并理解其内容。 - Chase Florell

0
我找到了一种使用ColorDialog获取所选颜色的十六进制代码的方法。
ColorDialog col = new ColorDialog();

col.ShowDialog();

string color = col.Color.ToArgb().ToString("x");

color = color.Substring(2, 6);

color = "#" + color;

MessageBox.Show(color);

button1.BackColor = System.Drawing.ColorTranslator.FromHtml(color);

0

虽然这个问题已经问了很久,但这可能会有用。它允许您在单个函数调用中转换ColorString,无论颜色是SystemColorKnownColor还是直接的ARGB。代码:

        public static Color Str2Color(string cS, Color oDefault)
        {
            string cColor;
            Color oColor;

            try
            {
                if ((cS == null) || (cS == ""))
                {
                    return oDefault;
                }
                if (cS.StartsWith("[SystemColor]"))
                {
                    cColor = cS.Substring(13);
                    oColor = Color.FromName(cColor);
                    return oColor;
                }
                else if (cS.StartsWith("[KnownColor]"))
                {
                    cColor = cS.Substring(12);
                    oColor = Color.FromName(cColor);
                    return oColor;
                }
                else if (cS.StartsWith("[ARGB]"))
                {
                    cColor = cS.Substring(6);
                    oColor = Color.FromArgb(Convert.ToInt32(cColor));
                    return oColor;
                }
                else
                    throw new IndexOutOfRangeException();
            }
            catch (Exception ex)
            {
                return oDefault;
            }
        }


        public static string Color2Str(Color oColor)
        {
            // To note:
            // 1. System.Windows.SystemColors => [SystemColor]
            //      Examples: SystemColors.Control, SystemColors.Window, SystemColors.WindowFrame. These are synonymous with System.Drawing.SystemColors, and are defined in the Windows style selected by the user.
            // 2. Windows.UI.Colors => [KnownColor]
            //      Examples: Colors.AliceBlue, Colors.AntiqueWhite, Colors.Aqua, Colors.Aquamarine etc. These are named colors that I think are the same as those expressable in HTML
            // 3. ARGB => [ARGB]
            //      Example: #ffff77 - hex representation of the RGB colour scheme.
            string cColor;

            
            try
            {
                if (oColor.IsSystemColor)
                {
                    cColor = "[SystemColor]" + oColor.Name;
                }
                else if (oColor.IsKnownColor)
                {
                    cColor = "[KnownColor]" + oColor.Name;
                }
                else
                {
                    cColor = "[ARGB]" + oColor.ToArgb();
                }

                return cColor;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

我将它放在一个静态的“帮助器”类中。这意味着你可以以人类可读和可编辑的格式(只要你命名正确)将值存储在数据库中。


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