2009-08-12 71 views
26

我剛剛遇到了這個奇怪的事情,我期望以不同的(邏輯)方式工作,但事實並非如此。它是一個錯誤還是一個「功能」?Databind ASP.NET列表ListItem到DropDownList問題

所以有一個DropDownList,我在代碼隱藏中使用ListItem列表填充。每一個新的列表項獲得2個參數,根據智能感知提供的文件,符合其文本和值:

List<ListItem> users = new List<ListItem>(); 
foreach (SubscriptionUser su in subscriptionDetails.UserList) 
{ 
    users.Add(new ListItem(su.FirstName + " " + su.LastName, su.EmailAddress)); 
} 
ddlPrimaryContact.DataSource = users; 
ddlPrimaryContact.DataBind(); 

現在,有人可以解釋我爲什麼數據綁定DropDownList的文本和值設置爲完全一樣(ListItem文本)而不是使用ListItem.Text作爲文本和ListItem.Value作爲值?

ARGH!! http://www.freeimagehosting.net/uploads/fe65d0e7d5.jpg

還是我做錯了什麼?

+0

既然你已經循環建立你的列表,爲什麼不直接添加每個列表項直接到下拉列表? – ScottE 2009-08-12 11:44:42

回答

53

嗨當​​databinding(任何事情)你需要設置DropDownList的DataTextField和DataValueField。在你的情況,你應該使用下面的代碼

List<ListItem> users = new List<ListItem>(); 
foreach (SubscriptionUser su in subscriptionDetails.UserList) 
{ 
    users.Add(new ListItem(su.FirstName + " " + su.LastName, su.EmailAddress)); 
} 
ddlPrimaryContact.DataTextField = "Text"; 
ddlPrimaryContact.DataValueField = "Value"; 
ddlPrimaryContact.DataSource = users; 
ddlPrimaryContact.DataBind(); 
+0

謝謝。在此期間我確實瞭解了這一點。我想我假設這個「匹配」會自動完成,但顯然我錯了... – Farinha 2009-08-12 12:50:01

8

你應該綁定您的下拉列表如下:

ddlPrimaryContact.DataSource = users; 
ddlPrimaryContact.DataTextField = "Value"; 
ddlPrimaryContact.DataValueField = "Text"; 
ddlPrimaryContact.DataBind(); 

如果你問爲什麼,因爲據我所知,數據綁定控件需要文本和值(如果它們不像上面那樣提供)通過調用數據源集合中每個項目的ToString方法。因此,集合中的每個ListItem都會通過ToString方法返回它的Text屬性。

5

或者,您也可以用這種方式綁定它。 (假設你可以添加一個只讀屬性,以SubscriptionUser叫全名(返回su.FirstName + 「」 + su.LastName)

ddlPrimaryContact.DataSource = subscriptionDetails.UserList; 
ddlPrimaryContact.DataBind(); 

然後,在你的ASPX頁面放:

<asp:DropDownList id="ddlPrimaryContact" runat="server" DataTextField="FullName" DataValueField="EmailAddress" /> 
+0

這是一個非常乾淨的方法,它更直觀和可維護。我結束了使用這種方法,因爲它遵循我的現有類對象的每個dropdownlist項目的結構。 – Bryan 2013-03-19 15:59:56

5

可以ASLO直接添加列表項到下拉..

List<ListItem> users = new List<ListItem>(); 
     for (int count = 0; count < 10; count++) 
     { 
      ListItem li = new ListItem("List " + count.ToString(), count.ToString()); 
      ddl.Items.Add(li); 
     } 
5

還有就是列表項項添加到一個DropDownList,並具有自動的.NET匹配列表項與DropDownList的文本文本的方式,和SA我的價值:

List<ListItem> users = new List<ListItem>(); 
// fill in list 
ddlUsers.Items.AddRange(users.ToArray());