Je fais une application Windows avec C #. J'utilise la boîte de dialogue Couleur de l'utilisateur pour sélectionner une couleur. J'aimerais stocker cette couleur dans une base de données et pouvoir le récupérer plus tard et pouvoir utiliser cette couleur dans l'interface utilisateur. P>
Quelle approche me suggéreriez-vous? P>
4 Réponses :
Le meilleur moyen sera de stocker la couleur hexagonale dans un champ de base de données Depuis que vous devez le convertir / à partir d'une couleur de contrôle, vous pouvez utiliser nvarchar (7) code> ... L'entrée serait
#ffffff code> comme exemple.
Varcharchar (6) CODE> fonctionnerait aussi bien, et prend moins d'espace dans votre DB. Assurez-vous simplement d'ajouter le
# code> dans votre code.
System.Drawing.ColorTranslator.fromhtml (OneHexColor) code> p>
+1 - Bien que je pense qu'un varchar code> suffirait car vous n'êtes pas inquiet à propos de Unicode pour les valeurs RVB.
@Cabbot, c'est vrai ... force d'habitude pour moi depuis que je fixais tout pour la localisation ... mon mauvais.
Mais alors comment puis-je récupérer ces valeurs et les définir pour contrôler les couleurs?
Le problème consiste à convertir la couleur au format #ffffff et à l'arrière facilement. La couleur n'a pas de méthode statique comme de Fromargb qui prend une chaîne hexagonale.
@Pseudo. Yup, j'aime cette solution simplement à cause du facteur de lisibilité. L'autre réponse est bonne aussi, mais je détesterais personnellement à regarder une table de dB avec un gros Int comme couleur: s
+1 pour nvarchar code>! Pourquoi gâcher avec la conversion de la parfaite bonne UTF-16 que c #, la structure .NET et Windows utilise des back-et-Vers une nouvelle carte de code 8 bits de 1980 à 8 bits choisis au hasard lorsque cette instance de base de données a été installée?
Une autre chose, j'utilise le colordialog pour obtenir la couleur de l'utilisateur. Comment changer le résultat à une valeur hexadécimale?
@Jeffrey, outre le fait que si vous êtes inquiet de ce type de données remplissant un DB, vous devez vous y rendre avec un grand nombre d'enregistrements. SQL Server Express sera bas sur sa limite de numéro d'enregistrement avant la fin de la taille des données sur NvarcharNar (7). Et SQL Server Standard ne dispose pas de ces limites arbitraires et l'espace disque dur est bon marché pas cher !!!
@rock: semble que c # n'a pas de fonction hexagone
Avez-vous essayé d'importer le système.Drawing ou de l'espace de noms.Drawing.color? Je n'ai pas de studio visuel devant moi pour tester cela ... Désolé.
System.Drawing est là. Mais je ne pense pas que cela a quelque chose à voir avec hexagone non? Quoi qu'il en soit, j'ai trouvé un moyen d'obtenir le code hexagonal. Je vais le poster dans ma réponse
Cette approche ne fournit pas de résultats cohérents. TOHTML CODE> retournera parfois une valeur hexagone et d'autres fois renvoient le nom de la couleur (en fonction de si un nom est disponible). Et bien que je suis sûr que
fromhtml code> traduira correctement, vous perdez la cohérence avec la valeur stockée dans la base de données. Ne pas mentionner que certains noms de couleur sont supérieurs à 7 caractères
Qu'en est-il de la transparence? J'utilise cette méthode aussi. Mais maintenant, je veux aussi stocker une valeur alpha de la couleur, que ColorTranslator ne prend pas en charge.
@MAHMOODVCS Je mettrais alpha dans un champ séparé dans la table et vérifiez que NULL dans le code.
J'utilise le système de fonctions.Drawing.color.fromargb () et system.drawing.color.toargb () Pour convertir la couleur de et en integer, puis le sauvegarder comme INT sur la base de données p>
C'est aussi une bonne méthode, cependant, je suppose que je préfère être capable de regarder la base de données et de comprendre le contenu.
J'ai trouvé un moyen d'obtenir le code hexagonal d'une couleur sélectionnée avec Colordialog
Voice après la question à l'origine, mais cela pourrait être utile. Il vous permet de convertir entre couleur code> et
string code> dans un seul appel de fonction, non si la couleur est un
SystemColor code>, un
connuColor code> ou droit
argb code>. Code:
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;
}
}
Avez-vous déjà une base de données que vous utilisez pour cette application?