콤보박스에 보여지는 값과 실제 사용하는 값을 각각 다르게 지정해보자(C#)


콤보박스를 편하고 깔끔하게 사용하기 위한 방법


  이 방법을 모를 때와 이 방법을 알고 난 뒤의 콤보박스 활용 능력은 극과 극을 달리게 될겁니다. 콤보박스에 상품 목록이 나열되어있고, 오름차순으로 정렬돼 있는 상태에서 DB와 연동해 현재 콤보박스에 선택된 상품 정보를 뿌린다고 생각해보세요. 요점은 콤보박스에 DB의 Primary Key와 관련된 무엇도 들어가면 안 되고, 오로지 상품명만 표시되어야 한다는 것입니다.

비효율적인 기존 처리 방식

  이 경우, 콤보박스의 리스트는 상품명 오름차순으로 정렬이 되었기 때문에 각 상품명에 대해 SelectedIndex와 DB Primary Key가 일치하지 않습니다. 그럼 결국 상품명과 PrimaryKey를 매핑시키는 작업을 거쳐 SelectionChanged 이벤트에서 작업을 하게 되겠죠.

효율적인 새 처리 방식

  하지만 콤보박스의 아이템에 string ProductName과 int ProductID가 속성으로 존재하며 콤보박스의 텍스트에는 ProductName만 출력하는 방법이 있다면? 이 모든 문제는 한번에 날아가게 됩니다. 그리고 그 방법은 당연히 존재합니다.

ComboBox.Items는 ObjectCollection

  Object가 뭡니까? 모든 객체가 상속받는 최상위 클래스죠. 하지만 이 Object 클래스엔 어떤 string property도 존재하지 않는데 어떻게 아이템으로 사용해 텍스트를 출력한다는 걸까요? 멍청하게 뭘 묻냐고요? 당연히 ToString()을 호출해 그 반환값을 집어넣는 거라고요? 맞습니다.

  Object 클래스는 네 개의 메소드를 갖고 있는데, 이중 ToString()이 있습니다. 이 메소드는 기본적으로는 Object의 클래스를 String 형식으로 반환해 주는데 이 ToString()을 오버라이드하면 ComboBox에 표시될 텍스트를 대체할 수 있습니다.

ToString() 오버라이딩

  자, 그럼 위 예시에서 필요한 것은 ProductName(string)과 ProductID(int)입니다. 이 두 개를 속성으로 갖는 클래스를 하나 만들어줍시다. (구조체여도 상관 없습니다.)
public class Product
{
    public string ProductName { get; set; }
    public int ProductID { get; set; }
}
  그리고 콤보박스엔 ProductName만 보여져야 하니 ToString() 메소드를 입맛에 맞게 바꿔줍시다.
public override string ToString()
{
    return ProductName;
}
  이제 콤보박스에 요 클래스의 객체들을 차곡차곡 집어넣어주세요.
comboBox1.Items.AddRange(new object[]
{
    new Product() { ProductName = "사과", ProductID = 2 },
    new Product() { ProductName = "배", ProductID = 4},
    new Product() { ProductName = "귤", ProductID = 8},
    new Product() { ProductName = "감", ProductID = 15}
});
  이제 콤보박스의 아이템을 선택해보시면 사과, 배, 귤, 감만이 보이는 것을 확인할 수 있을 겁니다.

Items에서 실제 클래스로 캐스팅

  일단 표시는 제대로 되는데, 이제 DB와 연동하기 위해 실제 ProductID값을 가져올 시간입니다. 아주 간단하죠.
var product = comboBox1.SelectedItem as Product; // 현재 선택된 아이템을 Product 타입으로 캐스팅합니다.
var id = product.ProductID; // ID를 가져오면 끝!
  이런 식으로 무궁무진한 활용이 가능합니다.

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭