【问题标题】:storing and retrieving colors with database, C# windows forms application使用数据库、C# windows 窗体应用程序存储和检索颜色
【发布时间】:2011-01-17 13:59:02
【问题描述】:

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

你会建议我什么方法?

【问题讨论】:

  • 您是否已有用于此应用程序的数据库?

标签: c# database winforms colors color-picker


【解决方案1】:

最好的方法是将十六进制颜色存储在数据库字段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);

【讨论】:

  • +1 - 虽然我相信 varchar 就足够了,因为您不必担心 RGB 值的 unicode。
  • @CAbbot,这是真的...习惯的力量,因为我为本地化设置了所有内容...我的错。
  • 但是如何检索这些值并将它们设置为控制颜色?
  • 问题是将颜色转换为#FFFFFF 格式并轻松转换回来。 Color 没有像 FromArgb 这样采用十六进制字符串的静态方法。
  • @尼克。是的,我喜欢这个解决方案仅仅是因为可读性因素。另一个答案也很好,但我个人讨厌看一个大 INT 作为颜色的数据库表:S
【解决方案2】:

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

【讨论】:

  • 这也是一个不错的方法,不过我想我更喜欢能够看数据库并理解内容。
【解决方案3】:

我找到了一种使用 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);

【讨论】:

    【解决方案4】:

    在最初提出问题之后的方式,但这可能很有用。它允许您在单个函数调用中在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;
                }
            }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2014-10-02
      • 2011-07-16
      • 2017-10-12
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多