【发布时间】:2012-10-01 17:41:00
【问题描述】:
我遇到了一个问题,我真的没想到会被耽搁这么多小时,这让我发疯了
如标题中所述,我需要两个 DropDownLists,其中 ToYears 列表的值从 FromYear 的选择开始:
从年份
2000
2001
2002
2003
2004
ToYear
2002
2003
2004
所以我尝试使用 2 asp:dropdownlist> 并在 FromYear 的 SelectedIndexEvent 期间更改选定的 ToYear 但这会触发选定的 FromYear 事件并且不知何故它不会再次触发。
现在我从 Ajax Control Toolkit 中找到了CascadingDropDown,并认为这可能是件好事。但我不想调用网络服务,而是想在实际页面后面的代码中使用方法。
还应在回发后记住选择 - 年份范围会根据后面代码中的属性而变化。
我在某处读到自动回发不适用于 CascadingDropDown。
您认为最优雅、最简单的解决方案是什么?
非常感谢您。
编辑:我将发布我的帖子的几个部分 - 希望对您有所帮助 标记:
<asp:DropDownList AutoPostBack="True" ID="DropDownFromYear" runat="server" OnSelectedIndexChanged="FromYearChanged" />
<asp:Label ID="UntilLabel" runat="server" Text=" until " />
<asp:UpdatePanel ID="ToYearUpdatePanel" runat="server" style="display: inline-block;">
<ContentTemplate>
<asp:DropDownList AutoPostBack="true" ID="DropDownToYear" runat="server" OnSelectedIndexChanged="ToYearChanged" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownFromYear" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
CodeBehind(从 OnInit 调用):
private void InitializeDropDownYears()
{
//Calculate the YearMin YearMax Properties
CalculateYearMinMax();
int adaptedFromYear = 0, adaptedToYear = 0;
//get the previously selected Years
if (DropDownToYear.SelectedItem != null) adaptedToYear = int.Parse(DropDownToYear.SelectedValue);
if (DropDownFromYear.SelectedItem != null) adaptedFromYear = int.Parse(DropDownFromYear.SelectedValue);
//check the minimum year constraints 2005 was selected but minYear is 2010 -> adpated is set to 2010
if (YearMin > adaptedFromYear || adaptedFromYear == 0) adaptedFromYear = YearMin;
if (YearMax < adaptedToYear || adaptedToYear == 0) adaptedToYear = YearMax;
//check the 5 year range constraint
if ((YearMax - YearMin) > 5)
{
adaptedFromYear = DateTime.Now.Year - 2;
adaptedToYear = DateTime.Now.Year + 2;
}
Dictionary<string, string> toYears = new Dictionary<string, string>();
Dictionary<string, string> fromYears = new Dictionary<string, string>();
for (int tempYear = YearMin; tempYear <= YearMax; tempYear++)
{
fromYears.Add(tempYear.ToString(), tempYear.ToString());
if (tempYear >= adaptedFromYear)
{
toYears.Add(tempYear.ToString(), tempYear.ToString());
}
}
DropDownFromYear.DataSource = fromYears;
DropDownFromYear.DataValueField = "Key";
DropDownFromYear.DataTextField = "Value";
DropDownFromYear.SelectedValue = adaptedFromYear.ToString();
DropDownFromYear.DataBind();
DropDownToYear.DataSource = toYears;
DropDownToYear.DataValueField = "Key";
DropDownToYear.DataTextField = "Value";
DropDownToYear.SelectedValue = adaptedToYear.ToString();
DropDownToYear.DataBind();
if(!IsPostBack)
{
SelectedFromYear = adaptedFromYear;
SelectedToYear = adaptedToYear;
}
}
private void CalculateYearMinMax()
{
IList<Task> taskList = CurrentLicense.TaskList;
List<DateTime> startDates = taskList.Select(task => task.StartDate).ToList();
YearMin = startDates.Min(date => date).Year;
List<DateTime> endDates = taskList.Select(task => task.EndDate).ToList();
YearMax = endDates.Max(date => date).Year;
}
事件处理程序:
protected void FromYearChanged(object sender, EventArgs e)
{
SelectedFromYear = int.Parse(DropDownToYear.SelectedValue);
SelectedToYear = int.Parse(DropDownFromYear.SelectedValue);
if (SelectedFromYear > SelectedToYear)
{
SelectedToYear = SelectedFromYear;
}
UpdateGanttTables();
}
protected void ToYearChanged(object sender, EventArgs e)
{
SelectedFromYear = int.Parse(DropDownToYear.SelectedValue);
SelectedToYear = int.Parse(DropDownFromYear.SelectedValue);
UpdateGanttTables();
}
【问题讨论】:
-
这应该完全可以用 c# 来实现。你能展示你的 selectedIndexChanged 方法中发生了什么吗?基本上,如果我理解正确,您想在 FromYear 下拉列表中选择一个值,然后通过选择该值,您希望 DDL“ToYear”从 FromYear 中选择的值开始?
-
就个人而言,如果我看到一个网站回发只是为了更新下拉列表,我会有点摇头。
-
嗨千,感谢您的快速响应。实际上我可以在 FromYear 下拉列表中有一个从 1950 到 2050 的范围,如果用户选择 FromYear:1980 它应该显示在 ToYear 1980 到 2050 中。如果他之前在这个范围内选择了一个 ToYear(例如 1990)它应该仍然是选择。如果先前选择的范围较小,则应使用 FromYear 的值。另一件事是:如果在第一个 PageLoad DateTime.Now.Year-2 上选择的可能范围大于 5 年,则应在 FromYear 中选择 ToYear DateTime.Now.Year+2。
-
@LeeTaylor 通过下拉菜单只应立即刷新页面的一部分。我打算为此使用更新面板。
标签: c# asp.net webforms viewstate