C# 一年范围内有2个下拉列表
我被困在一个我真的没想到会被耽搁这么多小时的问题上,这让我发疯 如标题所述,我需要两个下拉列表,其中ToYears列表的值从FromYear开始: FromYearC# 一年范围内有2个下拉列表,c#,asp.net,webforms,viewstate,C#,Asp.net,Webforms,Viewstate,我被困在一个我真的没想到会被耽搁这么多小时的问题上,这让我发疯 如标题所述,我需要两个下拉列表,其中ToYears列表的值从FromYear开始: FromYear 2000年 2001年 2002年 2003年 2004年 今年 2002年 2003年 2004年 因此,我尝试在FromYear的SelectedIndex事件期间使用2并更改selected ToYear,但这会触发selected FromYear事件,不知何故它不会再次触发 现在我从Ajax控件工具包中找到了,并认为这可能
2000年
2001年
2002年
2003年
2004年 今年
2002年
2003年
2004年 因此,我尝试在FromYear的SelectedIndex事件期间使用2并更改selected ToYear,但这会触发selected FromYear事件,不知何故它不会再次触发 现在我从Ajax控件工具包中找到了,并认为这可能是一件好事。但我不想调用web服务,而是希望在实际页面后面的代码中使用方法 此外,回发后应记住所选内容,并且年份范围根据代码隐藏中的属性而变化 我在某个地方读到autopostback不能与CascadingDropDown一起工作 您认为最优雅、最简单的解决方案是什么 事先非常感谢 编辑:我将发布我文章的几个部分-希望能有所帮助 标记:
填充
DropDownList
控件听起来很简单,对吗?当您使用ASP.NET WebForms的默认行为时。但是,当您想要获得特定功能时,可能会遇到一些问题,例如,在WebForms中,尝试使用AJAX填充DropDownLists
(这是一个真正的难题,我找到的唯一解决方案是禁用页面上的安全检查。最后,我找到了解决方案,我认为这是一个不错的解决方案,因为它使我能够:
- 首先用数据填充两个DDL
- 在两个DDL中预选项目
- 仍然在页面上使用EnableEventValidation=“true”
- 我只需在DDL上调用DataBind();即可更新DDL
与我以前的方法的主要区别是,我在DDL的OnDataBinding事件期间使用数据填充DDL。因此,当我在PageLoad期间执行DataBind()时,这将自动发生。我首先必须确保的唯一一件事是填充包含我的信息的字典
如果我想从FromYearsDDL的SelectionChange事件中更新ToYearsDDL,我只需更新ToYearsDDL的数据并调用ToYearsDDL.DataBind()
希望这能帮助其他遇到同样问题的人
下面是标记:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LinkedDropDownsBound.aspx.cs"
Inherits="ASP.Net_Spielwiese.LinkedDropDownsBound" EnableEventValidation="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:UpdatePanel runat="server" ID="updatePanel">
<ContentTemplate>
<div>
<asp:Label ID="FromLabel" Text="From" Enabled="false" runat="server" />
</div>
<div>
<asp:DropDownList runat="server" ID="FromYearsDDL" AutoPostBack="true" CausesValidation="false" OnDataBinding="DDLFromDataBind"
OnSelectedIndexChanged="DDLFromSelectedIndexChanged">
</asp:DropDownList>
</div>
<div>
<asp:Label ID="ToLabel" Text="To" Enabled="false" runat="server" />
</div>
<div>
<asp:DropDownList runat="server" ID="ToYearsDDL" AutoPostBack="true" CausesValidation="false" OnDataBinding="DDLToDataBind"
OnSelectedIndexChanged="DDLToSelectedIndexChanged"/>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
下面是代码:
public partial class LinkedDropDownsBound : System.Web.UI.Page
{
public Dictionary<String, Boolean> FromYears
{
get
{
if (ViewState["FromYears"] == null)
{
ViewState["FromYears"] = new Dictionary<String, Boolean>();
}
return ViewState["FromYears"] as Dictionary<String, Boolean>;
}
set
{
ViewState["FromYears"] = value;
}
}
public Dictionary<String, Boolean> ToYears
{
get
{
if (ViewState["ToYears"] == null)
{
ViewState["ToYears"] = new Dictionary<String, Boolean>();
}
return ViewState["ToYears"] as Dictionary<String, Boolean>;
}
set
{
ViewState["ToYears"] = value;
}
}
public int MinYear = 1975;
public int MaxYear = 2015;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitFromYears();
InitToYears();
DataBind();
}
}
private void InitFromYears()
{
FromYears = new Dictionary<string, bool>();
IEnumerable<int> fromRange = Enumerable.Range(MinYear, MaxYear - MinYear);
foreach (var fromYear in fromRange)
{
FromYears.Add(fromYear.ToString(), fromYear == (DateTime.Now.Year - 2));
}
}
private void InitToYears()
{
ToYears = new Dictionary<string, bool>();
//get the selected FromYear Value
int minToYear = Convert.ToInt32(FromYears.FirstOrDefault(dict => dict.Value).Key);
//make sure ToYears is at least FromYears
if (minToYear < Convert.ToInt32(FromYears.Min(k => k.Key)))
{
minToYear = Convert.ToInt32(FromYears.Min(k => k.Key));
}
IEnumerable<int> toRange = Enumerable.Range(minToYear, MaxYear - minToYear);
foreach (var toYear in toRange)
{
ToYears.Add(toYear.ToString(), toYear == (DateTime.Now.Year + 2));
}
}
protected void DDLFromDataBind(object sender, EventArgs e)
{
FromYearsDDL.DataSource = FromYears;
FromYearsDDL.DataValueField = "Key";
FromYearsDDL.DataTextField = "Key";
FromYearsDDL.SelectedValue = FromYears.FirstOrDefault(y => y.Value).Key;
}
protected void DDLFromSelectedIndexChanged(object sender, EventArgs e)
{
//update the FromYear Dictionary
var tempDictionary = FromYears.ToDictionary(fromYear => fromYear.Key, fromYear => fromYear.Key.Equals(FromYearsDDL.SelectedValue));
FromYears = tempDictionary;
//Call Bind on the ToYear DDL
ToYearsDDL.DataBind();
//do my other update stuff here
FromLabel.Text = FromYearsDDL.SelectedValue;
ToLabel.Text = ToYearsDDL.SelectedValue;
}
protected void DDLToSelectedIndexChanged(object sender, EventArgs e)
{
//do my other update stuff here
FromLabel.Text = FromYearsDDL.SelectedValue;
ToLabel.Text = ToYearsDDL.SelectedValue;
}
protected void DDLToDataBind(object sender, EventArgs e)
{
InitToYears();
ToYearsDDL.DataSource = ToYears;
ToYearsDDL.DataValueField = "Key";
ToYearsDDL.DataTextField = "Key";
ToYearsDDL.SelectedValue = ToYears.FirstOrDefault(y => y.Value).Key;
}
}
public分部类LinkedDropDownsBound:System.Web.UI.Page
{
年公共词典
{
得到
{
如果(ViewState[“FromYears”]==null)
{
ViewState[“FromYears”]=新字典();
}
将ViewState[“FromYears”]作为字典返回;
}
设置
{
ViewState[“FromYears”]=值;
}
}
公共词典
{
得到
{
如果(ViewState[“ToYears”]==null)
{
ViewState[“ToYears”]=新字典();
}
将ViewState[“ToYears”]作为字典返回;
}
设置
{
ViewState[“ToYears”]=值;
}
}
公共财政年度=1975年;
公共int MaxYear=2015年;
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
初始年();
初始年份();
数据绑定();
}
}
私人股本年数()
{
FromYears=新字典();
IEnumerable fromRange=Enumerable.Range(MinYear,MaxYear-MinYear);
foreach(fromRange中的var fromYear)
{
FromYears.Add(fromYear.ToString(),fromYear==(DateTime.Now.Year-2));
}
}
私人股本年数()
{
ToYears=新字典();
//获取所选的FromYear值
int minToYear=Convert.ToInt32(从years.FirstOrDefault(dict=>dict.Value.Key);
//确保ToYears至少是FromYears
if(minToYeark.Key)))
{
minToYear=Convert.ToInt32(FromYears.Min(k=>k.Key));
}
IEnumerable toRange=可枚举的.Range(minToYear,MaxYear-minToYear);
foreach(toRange的当年var)
{
添加(toYear.ToString(),toYear==(DateTime.Now.Year+2));
}
}
受保护的void DDLFromDataBind(对象发送方,事件参数e)
{
fromYearsdl.DataSource=FromYears;
fromYearsdl.DataValueField=“Key”;
fromYearsdl.DataTextField=“Key”;
FromYearsdl.SelectedValue=FromYears.FirstOrDefault(y=>y.Value).Key;
}
受保护的无效DDLFromSelectedIndexChanged(对象发送方,事件参数e)
{
//更新FromYear字典
var tempDictionary=FromYears.ToDictionary(fromYear=>fromYear.Key,fromYear=>fromYear.Key.Equals(FromYearsDDL.SelectedValue));
FromYears=临时字典;
//调用ToYear DDL上的Bind
toyersddl.DataBind();
//在这里做我的其他更新
FromLabel.Text=fromYearsdl.SelectedValue;
ToLabel.Text=ToYearsDDL.SelectedValue;
}
受保护的无效DDLToSelectedIndexChanged(对象发送方,事件参数e)
{
//在这里做我的其他更新
FromLabel.Text=fromYearsdl.SelectedValue;
ToLabel.Text=ToYearsDDL.SelectedValue;
}
受保护的void DDLToDataBind(对象发送方,事件参数e)
{
初始年份();
ToYearsDDL.DataSource=ToYears;
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();
}
<asp:ScriptManager runat="server" ID="sm" />
<asp:UpdateProgress runat="server" AssociatedUpdatePanelID="updatePanel" DisplayAfter="0" DynamicLayout="true">
<ProgressTemplate>
Working...
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel runat="server" ID="updatePanel">
<ContentTemplate>
<div>
<asp:Label ID="Label1" Text="From" runat="server" AssociatedControlID="from" />
</div>
<div>
<asp:DropDownList runat="server" ID="from" AutoPostBack="true" CausesValidation="false" OnSelectedIndexChanged="from_SelectedIndexChanged">
</asp:DropDownList>
</div>
<div>
<asp:Label ID="Label2" Text="To" runat="server" AssociatedControlID="to" />
</div>
<div>
<asp:DropDownList runat="server" ID="to" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
private const int MaxYear = 2030;
private const int MinYear = 1959;
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
var fromRange = Enumerable.Range(MinYear, MaxYear - MinYear);
this.from.DataSource = fromRange;
this.from.DataBind();
}
}
protected void from_SelectedIndexChanged(object sender, EventArgs e)
{
var selectedYear = Convert.ToInt32(this.from.SelectedValue);
var toRange = Enumerable.Range(selectedYear, MaxYear - selectedYear);
this.to.DataSource = toRange;
this.to.DataBind();
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LinkedDropDownsBound.aspx.cs"
Inherits="ASP.Net_Spielwiese.LinkedDropDownsBound" EnableEventValidation="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:UpdatePanel runat="server" ID="updatePanel">
<ContentTemplate>
<div>
<asp:Label ID="FromLabel" Text="From" Enabled="false" runat="server" />
</div>
<div>
<asp:DropDownList runat="server" ID="FromYearsDDL" AutoPostBack="true" CausesValidation="false" OnDataBinding="DDLFromDataBind"
OnSelectedIndexChanged="DDLFromSelectedIndexChanged">
</asp:DropDownList>
</div>
<div>
<asp:Label ID="ToLabel" Text="To" Enabled="false" runat="server" />
</div>
<div>
<asp:DropDownList runat="server" ID="ToYearsDDL" AutoPostBack="true" CausesValidation="false" OnDataBinding="DDLToDataBind"
OnSelectedIndexChanged="DDLToSelectedIndexChanged"/>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
public partial class LinkedDropDownsBound : System.Web.UI.Page
{
public Dictionary<String, Boolean> FromYears
{
get
{
if (ViewState["FromYears"] == null)
{
ViewState["FromYears"] = new Dictionary<String, Boolean>();
}
return ViewState["FromYears"] as Dictionary<String, Boolean>;
}
set
{
ViewState["FromYears"] = value;
}
}
public Dictionary<String, Boolean> ToYears
{
get
{
if (ViewState["ToYears"] == null)
{
ViewState["ToYears"] = new Dictionary<String, Boolean>();
}
return ViewState["ToYears"] as Dictionary<String, Boolean>;
}
set
{
ViewState["ToYears"] = value;
}
}
public int MinYear = 1975;
public int MaxYear = 2015;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitFromYears();
InitToYears();
DataBind();
}
}
private void InitFromYears()
{
FromYears = new Dictionary<string, bool>();
IEnumerable<int> fromRange = Enumerable.Range(MinYear, MaxYear - MinYear);
foreach (var fromYear in fromRange)
{
FromYears.Add(fromYear.ToString(), fromYear == (DateTime.Now.Year - 2));
}
}
private void InitToYears()
{
ToYears = new Dictionary<string, bool>();
//get the selected FromYear Value
int minToYear = Convert.ToInt32(FromYears.FirstOrDefault(dict => dict.Value).Key);
//make sure ToYears is at least FromYears
if (minToYear < Convert.ToInt32(FromYears.Min(k => k.Key)))
{
minToYear = Convert.ToInt32(FromYears.Min(k => k.Key));
}
IEnumerable<int> toRange = Enumerable.Range(minToYear, MaxYear - minToYear);
foreach (var toYear in toRange)
{
ToYears.Add(toYear.ToString(), toYear == (DateTime.Now.Year + 2));
}
}
protected void DDLFromDataBind(object sender, EventArgs e)
{
FromYearsDDL.DataSource = FromYears;
FromYearsDDL.DataValueField = "Key";
FromYearsDDL.DataTextField = "Key";
FromYearsDDL.SelectedValue = FromYears.FirstOrDefault(y => y.Value).Key;
}
protected void DDLFromSelectedIndexChanged(object sender, EventArgs e)
{
//update the FromYear Dictionary
var tempDictionary = FromYears.ToDictionary(fromYear => fromYear.Key, fromYear => fromYear.Key.Equals(FromYearsDDL.SelectedValue));
FromYears = tempDictionary;
//Call Bind on the ToYear DDL
ToYearsDDL.DataBind();
//do my other update stuff here
FromLabel.Text = FromYearsDDL.SelectedValue;
ToLabel.Text = ToYearsDDL.SelectedValue;
}
protected void DDLToSelectedIndexChanged(object sender, EventArgs e)
{
//do my other update stuff here
FromLabel.Text = FromYearsDDL.SelectedValue;
ToLabel.Text = ToYearsDDL.SelectedValue;
}
protected void DDLToDataBind(object sender, EventArgs e)
{
InitToYears();
ToYearsDDL.DataSource = ToYears;
ToYearsDDL.DataValueField = "Key";
ToYearsDDL.DataTextField = "Key";
ToYearsDDL.SelectedValue = ToYears.FirstOrDefault(y => y.Value).Key;
}
}
private void BindYearDropdown()
{
int year;
for (year = DateTime.Now.Year; year >= 2010 ; year--)
{
DDLYear.Items.Add(year.ToString());
}
}