C # DropDownList với Từ điển dưới dạng DataSource


112

Tôi muốn đặt DataTextFieldDataValueFieldcủa một Dropdownlist(languageList) sử dụng Từ điển (danh sách) của languageCod(en-gb) làm khóa và tên ngôn ngữ (tiếng Anh) làm văn bản hiển thị.

Mã liên quan:

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();

Làm thế nào tôi có thể đặt DataTextFieldDataValueField?

Câu trả lời:


205

Tương tự như vậy, bạn có thể đặt DataTextField và DataValueField của DropDownList bằng văn bản "Khóa" và "Giá trị":

    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
Tôi khuyên bạn nên đặt TextField thành "key" và ValueField thành Value. Tôi nghĩ điều đó trực quan hơn.
MGOwen

15
@MGOwen Có vẻ trực quan khi đặt DataValueField thành Giá trị, vì "Giá trị" phổ biến, nhưng nó thực sự phi logic trong việc sử dụng thường xuyên cơ cấu dữ liệu / điều khiển. Để biết chi tiết về điều này, hãy xem nhận xét của tôi về câu trả lời của Jon Skeet.
Dani

Tôi không thấy danh sách. Thêm vào mà mất 2 args .. chỉ một cái mà mất một đối số. đây có phải là winforms không ??
hrh

@hrh thì có thể bạn không sử dụng a Dictionary<TKey, TValue>, nhưng có thể là a List<T>.
sshow 21/12/12

@Canavar có thể đặt trường DataText là "key-Value" .... không? Tôi làm nó như thế nào.
Sravan Kumar

11

Khi một từ điển được liệt kê, nó sẽ mang lại KeyValuePair<TKey,TValue>đối tượng ... vì vậy bạn chỉ cần xác định "giá trị" và "khóa" cho DataTextFieldDataValueFieldtương ứng, để chọn giá trị gia tăng / chính tài sản.

Nhờ lời nhận xét của Joe, tôi đã đọc lại câu hỏi để có những câu hỏi đúng đắn. Thông thường, tôi mong đợi "khóa" trong từ điển là văn bản được hiển thị và "giá trị" là giá trị được tìm nạp. Tuy nhiên, mã mẫu của bạn sử dụng chúng theo cách khác. Trừ khi bạn thực sự cần chúng theo cách này, bạn có thể muốn xem xét viết mã của mình dưới dạng:

list.Add(cul.DisplayName, cod);

(Và sau đó thay đổi liên kết để sử dụng "Khóa" cho DataTextFieldvà "Giá trị" cho DataValueField, tất nhiên.)

Trên thực tế, tôi đề nghị rằng có vẻ như bạn thực sự muốn một danh sách hơn là một từ điển, bạn có thể muốn xem xét lại việc sử dụng từ điển ngay từ đầu. Bạn chỉ có thể sử dụng 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));
}

Ngoài ra, hãy sử dụng danh sách các CultureInfogiá trị thuần túy . LINQ làm cho điều này thực sự dễ dàng:

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

Nếu không sử dụng LINQ, bạn vẫn có thể sử dụng vòng lặp foreach bình thường:

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
Trên thực tế, điều này không chính xác - hãy xem nhận xét của tôi về câu trả lời được chấp nhận.
Winston Smith

À, tôi đã đọc nhầm câu hỏi. Tôi có vẻ khó hiểu khi đưa chúng vào từ điển một cách "sai". Sẽ chỉnh sửa câu trả lời của tôi.
Jon Skeet

1
@JonSkeet Lý do cho liên kết "ngược" là dữ liệu đang được lưu trữ trong từ điển dưới dạng cặp khóa / giá trị thường sử dụng khóa (giá trị tra cứu) làm liên kết dữ liệu (ví dụ: để tham chiếu cơ sở dữ liệu) và trong danh sách thả xuống , điều này tương ứng với DataValueField, tức là giá trị trả về của POST, cho bạn biết nhiều hơn về mục đã chọn hơn là DataTextField, tức là giá trị hiển thị. (DropDownLists chỉ có một quy ước đặt tên kém)
Dani

6

Nếu DropDownList được khai báo trong trang aspx của bạn chứ không phải trong đoạn mã, bạn có thể làm như thế này.

.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
    }
};

Đã ủng hộ. Đáng chú ý là BẮT BUỘC rằng đây là một đối tượng phía máy chủ để được đánh giá. Bạn không thể chuyển nó vào dòng bằng cách sử dụng <% # cú pháp%>. Cho dù đó là <script runat = "server"> hay như trong ví dụ của Matt ở trên, tùy thuộc vào bạn. Nó thực sự hoạt động.
Barry

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.