사전을 DataSource로 사용하는 C # DropDownList


112

나는 설정할 DataTextFieldDataValueFieldDropdownlist의 사전 (목록)을 사용하여 (languageList) languageCod화면에 텍스트로 키와 언어 이름 (영어)으로 (EN-GB)의.

관련 코드 :

string[] languageCodsList= service.LanguagesAvailable();
Dictionary<string, string> list = 
                   new Dictionary<string, string>(languageCodsList.Length);

foreach (string cod in languageCodsList)
{
    CultureInfo cul = new CultureInfo(cod);
    list.Add(cod, cul.DisplayName);
}
languageList.DataSource = list;
languageList.DataBind();

어떻게 설정 DataTextField하고 DataValueField?

답변:


205

이와 같이 "Key"및 "Value"텍스트를 사용하여 DropDownList의 DataTextField 및 DataValueField를 설정할 수 있습니다.

    Dictionary<string, string> list = new Dictionary<string, string>();
    list.Add("item 1", "Item 1");
    list.Add("item 2", "Item 2");
    list.Add("item 3", "Item 3");
    list.Add("item 4", "Item 4");

    ddl.DataSource = list;
    ddl.DataTextField = "Value";
    ddl.DataValueField = "Key";
    ddl.DataBind();

12
TextField를 "key"로 설정하고 ValueField를 Value로 설정하는 것이 좋습니다. 더 직관적이라고 생각합니다.
MGOwen 2012 년

15
@MGOwen 일반적인 "값"때문에 DataValueField를 Value로 설정하는 것은 직관적 인 것처럼 보일 수 있지만 실제로는 데이터 구조 / 컨트롤을 정기적으로 사용하는 경우 비논리적입니다. 이에 대한 자세한 내용은 Jon Skeet의 답변에 대한 내 의견을 참조하십시오.
Dani

나는 목록을 볼 수 없습니다. 2 개의 인수를 취하는 추가 .. 하나의 인수를 취하는 유일한 하나. 이 winforms입니까 ??
hrh dec. 05

@hrh 당신은 아마 사용하지 않을 Dictionary<TKey, TValue>것입니다 List<T>.
sshow dec

@Canavar는 DataText 필드를 "key-Value"로 설정할 수 있습니다 ....? 내가 어떻게 해.
Sravan 쿠마

11

사전 열거되면 얻을 것입니다 KeyValuePair<TKey,TValue>그냥 "값"을위한 "키"를 지정해야합니다 ... 그래서 객체 DataTextFieldDataValueField선택에 각각 / 속성을.

Joe의 의견 덕분에 나는 올바른 방법을 찾기 위해 질문을 다시 읽었습니다. 일반적으로 사전에있는 "키"는 표시되는 텍스트이고 "값"은 가져온 값이 될 것으로 예상합니다. 샘플 코드는 다른 방식으로 사용합니다. 이런 식으로 실제로 필요하지 않는 한 코드를 다음과 같이 작성하는 것이 좋습니다.

list.Add(cul.DisplayName, cod);

( 물론에 "키"를 사용 DataTextField하고 "값" 을 사용하도록 바인딩을 변경합니다 DataValueField.)

사실 사전이 아닌 목록을 원하는 것 같기 때문에 처음부터 사전을 사용하는 것을 다시 고려할 수 있습니다. 다음을 사용할 수 있습니다 List<KeyValuePair<string, string>>.

string[] languageCodsList = service.LanguagesAvailable();
var list = new List<KeyValuePair<string, string>>();

foreach (string cod in languageCodsList)
{
    CultureInfo cul = new CultureInfo(cod);
    list.Add(new KeyValuePair<string, string>(cul.DisplayName, cod));
}

또는 일반 CultureInfo값 목록을 사용하십시오 . LINQ는이 작업을 정말 쉽게 만듭니다.

var cultures = service.LanguagesAvailable()
                      .Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();

LINQ를 사용하지 않는 경우에도 일반 foreach 루프를 사용할 수 있습니다.

List<CultureInfo> cultures = new List<CultureInfo>();
foreach (string cod in service.LanguagesAvailable())
{
    cultures.Add(new CultureInfo(cod));
}
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();

3
실제로 이것은 잘못된 것입니다. 받아 들인 답변에 대한 내 의견을 참조하십시오.
Winston Smith

아, 나는 질문을 잘못 읽었습니다. "잘못된"방식으로 사전에 넣는 것이 혼란스러워 보입니다. 내 대답을 편집합니다.
Jon Skeet

1
@JonSkeet "역방향"연결의 이유는 사전에 키 / 값 쌍으로 저장되는 데이터가 일반적으로 키 (조회 값)를 데이터 연결 (예 : 데이터베이스 참조 용) 및 드롭 다운 목록으로 사용하기 때문입니다. , 이것은 DataValueField, 즉 POST 의 반환 값 에 해당합니다. 이것은 DataTextField, 즉 표시 값보다 선택한 항목에 대해 더 많이 알려줍니다. (DropDownLists는 이름 지정 규칙이 좋지 않습니다.)
Dani

6

DropDownList가 코드 숨김이 아닌 aspx 페이지에서 선언 된 경우 다음과 같이 할 수 있습니다.

.aspx :

<asp:DropDownList ID="ddlStatus" runat="server" DataSource="<%# Statuses %>"
     DataValueField="Key" DataTextField="Value"></asp:DropDownList>

.aspx.cs :

protected void Page_Load(object sender, EventArgs e)
{
    ddlStatus.DataBind();
    // or use Page.DataBind() to bind everything
}

public Dictionary<int, string> Statuses
{
    get 
    {
        // do database/webservice lookup here to populate Dictionary
    }
};

찬성. 이것이 평가할 서버 측 객체 여야한다는 점은 주목할 만합니다. <% # syntax %>를 사용하여 인라인으로 전달할 수 없습니다. 그것이 <script runat = "server">이든 위의 Matt의 예에서 볼 수 있든 상관 없습니다. 실제로 작동합니다.
Barry

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.