C# DropDownList设置了错误的SelectedValue

C# DropDownList设置了错误的SelectedValue,c#,asp.net,C#,Asp.net,我试图根据查询字符串中传递的值设置未绑定DropDownList的值。这是我的密码: ListItem item = null; for (int x = 0; x < 60; x++) { item = new ListItem(x.ToString("D2"), x.ToString("D2")); ddStartMinutes.Items.Add(item);

我试图根据查询字符串中传递的值设置未绑定DropDownList的值。这是我的密码:

ListItem item = null;
            for (int x = 0; x < 60; x++)
            {
                item = new ListItem(x.ToString("D2"), x.ToString("D2"));
                ddStartMinutes.Items.Add(item);
                ddEndMinutes.Items.Add(item);
                if (x < 24)
                {
                    ddStartHours.Items.Add(item);
                    ddEndHours.Items.Add(item);
                }
            }

        if (Request.QueryString.Count > 5)
        {
            string startDate = Request.QueryString["startDate"];
            string startHour = Request.QueryString["startHour"];
            string startMin = Request.QueryString["startMin"];
            string endDate = Request.QueryString["endDate"];
            string endHour = Request.QueryString["endHour"];
            string endMin = Request.QueryString["endMin"];
            string cabinet = Request.QueryString["cabinet"];

            txtStartDate.Text = startDate;
            txtEndDate.Text = endDate;
            ddStartHours.SelectedValue = startHour;
            ddStartMinutes.SelectedValue = startMin;
            ddEndHours.SelectedValue = endHour;
            ddEndMinutes.SelectedValue = endMin;
            ddCabinets.SelectedValue = cabinet;

            runReport();
        }
ListItem=null;
对于(int x=0;x<60;x++)
{
项目=新列表项目(x.ToString(“D2”)、x.ToString(“D2”);
ddStartMinutes.Items.Add(item);
ddEndMinutes.Items.Add(项目);
if(x<24)
{
ddStartHours.Items.Add(item);
ddEndHours.Items.Add(项目);
}
}
如果(Request.QueryString.Count>5)
{
字符串startDate=Request.QueryString[“startDate”];
string startHour=Request.QueryString[“startHour”];
字符串startMin=Request.QueryString[“startMin”];
字符串endDate=Request.QueryString[“endDate”];
字符串endHour=Request.QueryString[“endHour”];
字符串endMin=Request.QueryString[“endMin”];
string cabinet=Request.QueryString[“cabinet”];
Text=startDate;
Text=endDate;
ddStartHours.SelectedValue=startHour;
ddStartMinutes.SelectedValue=startMin;
ddEndHours.SelectedValue=endHour;
ddEndMinutes.SelectedValue=endMin;
ddCabines.SelectedValue=文件柜;
runReport();
}
我首先构建下拉列表,然后尝试根据查询字符串设置所选值。所有下拉列表都设置为endMin的值,而不是正确的值

如果我在runReport()之前调试并添加断点;我看到每个字符串变量都具有查询字符串中的正确值,但是每个DropDownList selectedValues都设置为endMin,而不是其查询字符串值

例如,如果查询字符串中的startHour为1,startMin为2,endHour为3,endMin为4,则每个字符串变量都可以从查询字符串中正确设置,但下拉选择的值都设置为4

我被难倒了。有什么想法吗?

这是DropDownList中的一个“缺陷”。我使用此扩展来绕过它:

    /// <summary>
    /// Sets the selected item by value.
    /// </summary>
    /// <param name="list">Drop down list to select value on</param>
    /// <param name="value">Value to select</param>
    public static void SetSelectedByValue(this DropDownList list, string value)
    {
        var listItem = list.Items.FindByValue(value);
        if (listItem != null)
        {
            list.SelectedIndex = list.Items.IndexOf(listItem);
        }
    }

您可以使用以下命令

ddStartHours.Items.FindByValue(startHour).Selected = true;

这应该正确设置值,尽管上面的扩展正在执行此操作,但您可以在上述代码的一行中执行此操作

假设您知道通过查询字符串传入的值始终在下拉列表中,您可以执行以下操作:

var item = ddStartHours.Items.FindByValue(startHour);
if(item != null)
     item.Selected = true;
ddStartHours.Items.FindByValue(startHour)=true

为了安全起见;您可以始终添加空检查,如下所示:

var item = ddStartHours.Items.FindByValue(startHour);
if(item != null)
     item.Selected = true;
编辑:

重新审视;看起来下拉列表之间的共享项是原因。如果您有
ListItem1
,并且将其添加到
ddStartHours
ddEndHours
;选择一个也会选择另一个


我可能会对它进行重构,使其具有一个静态方法,该方法可以返回数小时和数分钟的列表项集合,并使用该集合绑定到下拉列表。

问题在于在下拉列表之间共享
列表项。要修复它,请使用:

for (int x = 0; x < 60; x++) 
{ 
    var value = x.ToString("D2");
    ddStartMinutes.Items.Add(new ListItem(value, value));
    ddEndMinutes.Items.Add(new ListItem(value, value));
    if (x < 24) 
    { 
        ddStartHours.Items.Add(new ListItem(value, value));
        ddEndHours.Items.Add(new ListItem(value, value));
    }
}
for(int x=0;x<60;x++)
{ 
var值=x.ToString(“D2”);
ddStartMinutes.Items.Add(新列表项(value,value));
添加(新列表项(值,值));
if(x<24)
{ 
ddStartHours.Items.Add(新列表项(值,值));
添加(新列表项(值,值));
}
}

可能发生这种情况是因为您在下拉列表中共享项目非常好;如果在下拉列表之间共享项目;在ddStartHours中选择一个项目也会在ddEndHours(反之亦然)Amiram中选择相同的项目——这确实是问题所在!在每次添加之前,我复制了item=newlistItem行,它解决了这个问题。如果您将其添加为答案,我会将其标记为正确。请注意,此行
var item=ddStartHours…
可能引发异常。你想把它包装成一个例外块。谢谢。我也有同样的问题,用你的答案解决了我的问题。有时行为不合逻辑。PHP中没有类似的问题。:)