개발을 하다보면 특정한 값들을 사전 정의해서 사용하는데 enum을 많이 활용한다.
그런데 항상 값에 대한 사전 정의 용도로 코드에서 활용하는 것에 그치는 것이 대 부분이다. 그런데 이것을 좀 더 생각해 보면 더욱 다양하게 활용할 수도 있다.
이번에는 enum을 ComboBox 의 데이터소스로 활용해 보도록 하자.
아이디어는 간단하다. Enum의 값과 표시되는 문장을 구분해서 넣어주기만 하면 된다.
[ 실제 활용 코드 ]
public enum RequestDept {
CallCenter = 0,
Development,
Enrollment,
Implementation,
Sales,
Support
}
comboBox1.DataSource = Enum.GetValues(typeof(RequestDept))
.Cast
.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 으로 구성한 예이다.
///
/// 지정한 Enum을 지정한 ListControl (DataSource 속성이 있는)에 DataSource로 설정한다.
///
///
/// DataSource가 설정될 대상 컨트롤입니다.
/// 기본 설정할 값입니다.
public static void FDT_DataSourceByEnum
if (@src.IsNull()) return;
if (!typeof(T).IsEnum) return;
@src.DataSource = Enum.GetValues(typeof(T))
.Cast
.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 검증을 하여야 한다.
댓글
댓글 쓰기