2012-08-09 81 views
2

我想设置基于查询字符串中传递的值的未绑定DropDownList的值。这里是我的代码:DropDownList设置错误SelectedValue

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

我从构建下拉列表开始,然后尝试根据查询字符串设置选定的值。所有下拉菜单都设置为endMin的值,而不是正确的值。

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

例如,如果查询字符串中的startHour是1,startMin是2,endHour是3,endMin是4,那么每个字符串变量都会从查询字符串中正确设置,但下拉选择的值都会被设置到4.

我很好难倒。有任何想法吗?

+2

也许发生这种情况,因为你在下拉之间共享项目 – 2012-08-09 14:06:17

+0

非常好的点Amiram;如果您在下拉菜单之间共享项目;在ddStartHours中选择一个项目也会在ddEndHours中选择相同的项目(反之亦然) – 2012-08-09 14:12:32

+0

Amiram--确实是这个问题!我在每次添加之前复制了item = new ListItem行,并解决了问题。 如果您将其添加为答案,我会将其标记为正确。 – tkooser 2012-08-09 14:20:52

回答

3

问题是在下拉菜单之间共享ListItem。修复它使用:

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)); 
    } 
} 
+0

非常感谢。我有同样的问题,并解决你的答案我的问题。 C#有时表现不合逻辑。在PHP中没有任何问题。 :) – 2015-11-17 08:27:11

0

这是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.SetSelectedByValue(startHour); 
      ddStartMinutes.SetSelectedByValue(startMin); 
      ddEndHours.SetSelectedByValue(endHour); 
      ddEndMinutes.SetSelectedByValue(endMin); 
      ddCabinets.SetSelectedByValue(cabinet); 
0

您可以使用以下

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

这应该正确设定值,虽然以上的扩展是这样做的,你可以在你的上面的代码中的一行中做到这一点

0

假设你要知道,通过查询字符串传递的值将始终是在下拉列表中,你可以做这样的事情:

ddStartHours.Items.FindByValue(startHour) = true;

为了安全起见,你总是可以在一个空检查添加这样的:

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

编辑:

在第二次看;似乎下降之间的共享项目是原因。如果您有ListItem1,并将其添加到ddStartHoursddEndHours;选择一个也会选择另一个。

我可能会重构它有一个静态方法返回一个ListItems的集合小时和分钟,并使用它绑定到下拉列表。

+0

请注意,此行'var item = ddStartHours ...'可以抛出异常。你想包装一个异常块。 – JonH 2012-08-09 15:10:31

相关问题