문제

winforms combobox를 열거 유형의 값에 바인딩하면, 즉

combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));

내가 동일한 결과를 얻을 수있는 방법을 누가 알 수 있지만, 각 열거 값과 일치하는 항목 외에도 선택이없는 빈 항목을 가질 수 있습니까?

열거 유형에 특수 값을 추가 할 수는 없습니다.

도움을 주셔서 감사합니다.

편집하다: 나는 그들의 이름이 아니라 실제 열거 값을 바인딩하고 싶다는 것을 분명히해야합니다. 실제 열거 값이 바인딩되면 Combobox는 텍스트를 표시하기 위해 ToString ()을 호출합니다.

도움이 되었습니까?

해결책 3

(문자열 모음에 묶고 싶지 않다는 것을 명확히하는 질문에 대한 편집을 참조하십시오).

더 많은 충격을받은 후에는 다음과 같은 괴물이 효과가있는 것 같습니다. combo1.selectedItem은 유형 객체이며 dbnull 또는 (Boxed?) 열거 값이 될 것입니다. 이 코드가 권장됩니까?

combo1.DataSource = (new object[] { DBNull.Value }
                        .Concat(Enum.GetValues(refToAnEnumType)
                            .Cast<object>())).ToList()

편집하다: 나는 Adam과 Andrew의 방법이 같은 일을하기 위해 쉽게 적응할 수 있습니다. 감사합니다!

다른 팁

당신이 게시 한 모든 코드를 시도했는지 확실하지 않지만 항목을 추가 할 수는 없습니다. 이것은 WPF가 아닌 Winforms이므로 "Databind"기능이 없습니다.

당신은 이것을 할 수 있습니다 :

public static string[] GetEnumValues<T>(bool includeBlank) 
{
    List<string> values = new List<string>((Enum.GetValues(typeof(T)) as T[]).Select(t => t.ToString()));

    if (includeBlank)
    {
        values.Insert(0, string.Empty);
    }

    return values.ToArray();
}

그 다음에

combo.DataSource = GetEnumValues<myEnumType>(true);

당신은 다음과 같은 것을 시도 할 수 있습니다 :

(Brad_z의 훌륭한 제안을 반영하도록 편집되었습니다)

static IEnumerable<String> getValues<T>(String initialValue)
{
    yield return initialValue;

    foreach (T t in Enum.GetValues(typeof(T)))
        yield return t.ToString();
}

static IEnumerable<String> getValues<T>()
{
    return getValues<T>(String.Empty);
}

이를 통해 다음과 같은 기능의 결과에 바인딩 할 수 있습니다.

combo1.DataSource = getValues<myEnumType>().ToArray();

또는 이와 같이, 초기 항목에 대해 다른 값을 지정하려면 다음과 같습니다.

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top