2

我正在尝试根据查询字符串中传递的值设置未绑定的 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();
        }

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

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

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

我很困惑。有任何想法吗?

4

4 回答 4

3

ListItem问题在于在下拉菜单之间共享s。要修复它,请使用:

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));
    }
}
于 2012-08-09T15:07:13.630 回答
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);
于 2012-08-09T14:01:10.863 回答
0

你可以使用以下

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

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

于 2012-08-09T14:08:17.603 回答
0

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

ddStartHours.Items.FindByValue(startHour) = true;

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

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

编辑:

再看一遍;似乎下拉菜单之间的共享项目是原因。如果你有ListItem1并且你把它添加到两个ddStartHoursddEndHours; 选择一个也会选择另一个。

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

于 2012-08-09T14:11:05.240 回答