我正在尝试根据查询字符串中传递的值设置未绑定的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。
我很难过。有什么想法吗?
答案 0 :(得分: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));
}
}
答案 1 :(得分:0)
这是一个&#34;缺陷&#34;在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);
答案 2 :(得分:0)
您可以使用以下
ddStartHours.Items.FindByValue(startHour).Selected = true;
这应该正确设置值,虽然上面的扩展是这样做的,你可以在上面的代码中用一行代替
答案 3 :(得分:0)
假设您知道通过查询字符串传入的值将始终位于下拉列表中,您可以执行以下操作:
ddStartHours.Items.FindByValue(startHour) = true;
为了安全起见;你可以像这样添加一个空检查:
var item = ddStartHours.Items.FindByValue(startHour);
if(item != null)
item.Selected = true;
编辑:
第二眼看;似乎下拉之间的共享项目是原因。如果您有ListItem1
,则将其添加到ddStartHours
和ddEndHours
;选择一个也将选择另一个。
我可能会重构它以获得一个静态方法,该方法返回小时和分钟的ListItems集合,并使用它来绑定到下拉列表。