728x90
반응형
요거의 확장 개념입니다. 위처럼 처리할 경우 상수를 그대로 표시하기 때문에 보기 좋지 않죠.
DevExpress의 콤보박스의 경우 CustomDisplayText라는 이벤트를 통해 처리하는 것도 있는데 이 방법은 그 방법을 통하지 않는 일반적인 방식을 설명드리고자 합니다.
제가 사용하는 스킨 상수를 가지고 설명드립니다.
public enum SKINNAME
{
[Display(Name = "Light Blue")]
BLUE_LIGHT_SKIN = 0,
[Display(Name = "Light Green")]
GREEN_LIGHT_SKIN = 1,
[Display(Name = "Dark Blue")]
BLUE_DARK_SKIN = 2,
[Display(Name = "Dark Gray")]
DARK_GRAY_SKIN = 3,
}
표시 하고자 하는 것을 위처럼 [] 속성으로 선언합니다.
아래 클래스를 어딘가에 추가합니다.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
// 출처: https://stackoverflow.com/questions/13099834/how-to-get-the-display-name-attribute-of-an-enum-member-via-mvc-razor-code
public static class EnumHelper<T>
where T : struct, Enum // This constraint requires C# 7.3 or later.
{
public static IList<T> GetValues(Enum value)
{
var enumValues = new List<T>();
foreach (FieldInfo fi in value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public))
{
enumValues.Add((T)Enum.Parse(value.GetType(), fi.Name, false));
}
return enumValues;
}
public static T Parse(string value)
{
return (T)Enum.Parse(typeof(T), value, true);
}
public static IList<string> GetNames(Enum value)
{
return value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList();
}
public static IList<string> GetDisplayValues(Enum value)
{
return GetNames(value).Select(obj => GetDisplayValue(Parse(obj))).ToList();
}
private static string lookupResource(Type resourceManagerProvider, string resourceKey)
{
var resourceKeyProperty = resourceManagerProvider.GetProperty(resourceKey,
BindingFlags.Static | BindingFlags.Public, null, typeof(string),
new Type[0], null);
if (resourceKeyProperty != null)
{
return (string)resourceKeyProperty.GetMethod.Invoke(null, null);
}
return resourceKey; // Fallback with the key name
}
public static string GetDisplayValue(T value)
{
var fieldInfo = value.GetType().GetField(value.ToString());
var descriptionAttributes = fieldInfo.GetCustomAttributes(
typeof(DisplayAttribute), false) as DisplayAttribute[];
if (descriptionAttributes[0].ResourceType != null)
return lookupResource(descriptionAttributes[0].ResourceType, descriptionAttributes[0].Name);
if (descriptionAttributes == null) return string.Empty;
return (descriptionAttributes.Length > 0) ? descriptionAttributes[0].Name : value.ToString();
}
}
스킨목록을 ComboxEdit (DevExpress 컴포넌트)에 넣어볼께요.
foreach (string value in EnumHelper<SKINNAME>.GetDisplayValues(SKINNAME.BLUE_LIGHT_SKIN))
{
cboSkin.Properties.Items.Add(value);
}
요런식으로 처리하면 됩니다.
반응형
'개발 > C#' 카테고리의 다른 글
폼에 모든 라벨의 ForeColor 변경하기 (0) | 2023.06.27 |
---|---|
C# 클래스 라이브러리 작성 시 다중 타겟 프레임워크 지원 (0) | 2023.06.22 |
[2022.10] 형식 이니셜라이저에서 예외를 Throw했습니다. (0) | 2022.10.24 |
[2022.09] UTC시간을 현재 시간으로 변환하는 구문 (0) | 2022.09.30 |
[2022.09] 버전 관리의 고찰 (1) | 2022.09.29 |