2010-06-14 41 views
1

我有三個下拉框選擇用戶控件內的一年。在加載時,我爲一個下拉列表指定選定的值。另外兩個下拉菜單會自動分配相同的選定值。無論哪個下拉列表我分配一個選定的值,他們都得到相同的選定值。我已經嘗試重新創建一個新的用戶控件的下拉菜單,但同樣的事情發生。asp.net DropDownList同步

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DropDownTest.ascx.cs" Inherits="WymanOrgManagement.DropDownTest" %> 
<p> 
    <asp:DropDownList ID="ddlStartDateYear" runat="server"> 
    </asp:DropDownList> 
</p> 
<p> 
    <asp:DropDownList ID="ddlEndDateYear" runat="server"> 
    </asp:DropDownList> 
</p> 
<p> 
    <asp:DropDownList ID="Year" runat="server"></asp:DropDownList> 
</p> 

代碼背後:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace WymanOrgManagement 
{ 
    public partial class DropDownTest : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      populateDatesAndStates(); 
      ddlEndDateYear.SelectedIndex = 2; 
     } 

     protected void populateDatesAndStates() 
     { 
      ListItem init2 = new ListItem(); 
      init2.Text = init2.Value = "Year..."; 
      ddlStartDateYear.Items.Add(init2); 
      ddlEndDateYear.Items.Add(init2); 
      Year.Items.Add(init2); 

      for (int i = DateTime.Now.Year - 1; i < DateTime.Now.Year + 10; i++) 
      { 
       ListItem item = new ListItem(); 
       item.Text = item.Value = i.ToString(); 
       ddlStartDateYear.Items.Add(item); ddlEndDateYear.Items.Add(item); 
       Year.Items.Add(item); 
      } 
     } 
    } 
} 

有人可以幫助我弄清楚爲什麼三個下拉菜單似乎是同步?謝謝!

回答

1

所有三個下拉菜單共享ListItem的相同實例。當你在一個地方將它設置爲Selected時,它會在所有3個地方被選中。

ListItem item = new ListItem(); 
item.Text = item.Value = i.ToString(); 
ddlStartDateYear.Items.Add(item); 
ddlEndDateYear.Items.Add(item); 
Year.Items.Add(item); 

你可能想要做的是什麼

ddlStartDateYear.Items.Add(i.ToString()); 
ddlEndDateYear.Items.Add(i.ToString()); 
Year.Items.Add(i.ToString()); 

這將創建列表項的新實例(具有相同的值)進入每個列表。

1

問題是,您正在通過列表共享一個參考到ListItem。所以當.Selected屬性被設置爲一個下拉菜單時,因爲它是共享的,所以它被設置在所有屬性中。您可以添加字符串,而不是打擾ListItems,並完全避免該問題。

protected void populateDatesAndStates() 
{ 
    ddlStartDateYear.Items.Add("Year..."); 
    ddlEndDateYear.Items.Add("Year..."); 
    Year.Items.Add("Year..."); 

    for (int i = DateTime.Now.Year - 1; i < DateTime.Now.Year + 10; i++) 
    { 
     ddlStartDateYear.Items.Add(i.ToString()); 
     ddlEndDateYear.Items.Add(i.ToString()); 
     Year.Items.Add(i.ToString()); 
    } 
}