기본 콘텐츠로 건너뛰기

[C#] Enum 재활용... DataSource로 사용하기.

개발을 하다보면 특정한 값들을 사전 정의해서 사용하는데 enum을 많이 활용한다.

그런데 항상 값에 대한 사전 정의 용도로 코드에서 활용하는 것에 그치는 것이 대 부분이다. 그런데 이것을 좀 더 생각해 보면 더욱 다양하게 활용할 수도 있다.

이번에는 enum을 ComboBox 의 데이터소스로 활용해 보도록 하자.

아이디어는 간단하다. Enum의 값과 표시되는 문장을 구분해서 넣어주기만 하면 된다.

[ 실제 활용 코드 ]

public enum RequestDept {
    CallCenter = 0,
    Development,
    Enrollment,
    Implementation,
    Sales,
    Support
}

comboBox1.DataSource = Enum.GetValues(typeof(RequestDept))
                                                     .Cast<RequestDept>()
                                                     .Select(i => new { Key = (int)i, Value = i.ToString() })
                                                     .ToList();
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

위의 코드에서 중요한 것은 Enum의 값들을 익명 개체로 만들어서 Key, Value로 구성된 List로 만들어 주면 되는 것이다.

이미 다들 이렇게 활용하고 있겠지만, 나중에 다시 사용하기 위해서 정리해 둔다.

그 외에도 Enum 항목에 "Display", "Description" 특성들을 적용하여 다양하게 운영할 수도 있다. 그리고 이런 것들을 지원하는 Extension 메서드를 제공하면 더욱 좋다...

아래의 코드는 직접 구성하고 있는 Framework 의 구성 Library 중에서 Extension 으로 구성한 예이다.

/// <summary>
/// 지정한 Enum을 지정한 ListControl (DataSource 속성이 있는)에 DataSource로 설정한다.
/// </summary>
/// <typeparam name="T">대상 Enum 형식입니다.</typeparam>
/// <param name="src">DataSource가 설정될 대상 컨트롤입니다.</param>
/// <param name="selectedValue">기본 설정할 값입니다.</param>
public static void FDT_DataSourceByEnum<T>(this ListControl @src, T selectedValue) where T : struct, IComparable {
    if (@src.IsNull()) return;
    if (!typeof(T).IsEnum) return;
    @src.DataSource = Enum.GetValues(typeof(T))
              .Cast<T>()
              .Select(i => new { Key = i.AsInt(), Value = i.ToString() })
              .ToList();
    @src.DisplayMember = "Value";
    @src.ValueMember = "Key";
    @src.SelectedValue = selectedValue.AsInt());
}

위에서 중요한 것은 Generic Method에서 T 를 Enum으로 제한하는 경우는 struct, IComparable 로 제한을 하고 내부에서 IsEnum 검증을 하여야 한다.

댓글