asp.net DropDownList处于同步状态

asp.net DropDownList处于同步状态,asp.net,drop-down-menu,Asp.net,Drop Down Menu,我有三个下拉列表用于在用户控件中选择年份。加载时,我为一个下拉列表指定选定值。其他两个下拉列表将自动指定相同的选定值。无论我给哪个下拉列表指定一个选定值,它们都会得到相同的选定值。我曾尝试为下拉列表重新创建一个新的用户控件,但同样的情况也发生了 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DropDownTest.ascx.cs" Inherits="WymanOrgManagement.DropDownTest

我有三个下拉列表用于在用户控件中选择年份。加载时,我为一个下拉列表指定选定值。其他两个下拉列表将自动指定相同的选定值。无论我给哪个下拉列表指定一个选定值,它们都会得到相同的选定值。我曾尝试为下拉列表重新创建一个新的用户控件,但同样的情况也发生了

<%@ 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);
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
命名空间管理
{
公共部分类DropDownTest:System.Web.UI.UserControl
{
受保护的无效页面加载(对象发送方、事件参数e)
{
PopulatedAtsandState();
ddlEndDateYear.SelectedIndex=2;
}
受保护的无效填充状态和状态()
{
ListItem init2=新ListItem();
init2.Text=init2.Value=“年…”;
ddlStartDateYear.Items.Add(init2);
ddlEndDateYear.Items.Add(init2);
年份.项目.添加(初始2);
for(int i=DateTime.Now.Year-1;i

有人能帮我弄清楚为什么这三个下拉列表看起来是同步的吗?谢谢

所有三个下拉列表共享相同的
ListItem
实例。当您在一个位置将其设置为选中时,它将在所有三个位置变为选中

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

这将创建一个新的ListItem实例(具有相同的值)以进入每个列表。

问题在于,您正在跨列表共享对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());
    }
}
protectedvoid populateDatesAndStates()
{
ddlStartDateYear.Items.Add(“年…”);
ddlEndDateYear.Items.Add(“年…”);
年份。项目。添加(“年份…”);
for(int i=DateTime.Now.Year-1;i