[英]ASP.NET / C#: DropDownList SelectedIndexChanged event not firing
[英]ASP.NET / C#: DropDownList SelectedIndexChanged in server control not firing
我正在创建一个服务器控件,基本上绑定两个下拉列表,一个用于国家,一个用于州,并更新国家/地区的selectedindexchanged事件的状态下拉列表。 但是,它没有回发。 有什么想法吗? 将它们包装在UpdatePanel中的加分点(有渲染问题;也许是因为我没有要引用的页面?)
这就是我所拥有的(一些额外的数据访问内容被剥离):
public class StateProv : WebControl
{
public string SelectedCountry;
public string SelectedState;
private DropDownList ddlCountries = new DropDownList();
private DropDownList ddlStates = new DropDownList();
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
IList<Country> countries = GetCountryList();
IList<State> states = new List<State>();
if (SelectedCountry != null && SelectedCountry != "")
{
states = GetStateList(GetCountryByShortName(SelectedCountry).CountryShortName);
}
else
{
states.Add(new State { CountryId = 0, Id = 0, StateLabelName = "No states available", StateLongName = "No states available", StateShortName = "" });
}
ddlCountries.DataSource = countries;
ddlCountries.DataTextField = "CountryLongName";
ddlCountries.DataValueField = "CountryShortName";
ddlCountries.SelectedIndexChanged += new EventHandler(ddlCountry_SelectedIndexChanged);
ddlCountries.AutoPostBack = true;
ddlStates.DataSource = states;
ddlStates.DataTextField = "StateLongName";
ddlStates.DataTextField = "StateShortName";
ddlCountries.DataBind();
ddlStates.DataBind();
if (!string.IsNullOrEmpty(SelectedCountry))
{
ddlCountries.SelectedValue = SelectedCountry;
if (!string.IsNullOrEmpty(SelectedState))
{
ddlStates.SelectedValue = SelectedState;
}
}
}
protected override void RenderContents(HtmlTextWriter output)
{
ddlCountries.RenderControl(output);
ddlStates.RenderControl(output);
}
private IList<Country> GetCountryList()
{
//return stuff
}
private IList<State> GetStateList(Country country)
{
//return stuff
}
private IList<State> GetStateList(string countryAbbrev)
{
Country country = GetCountryByShortName(countryAbbrev);
return GetStateList(country);
}
private Country GetCountryByShortName(string countryAbbrev)
{
IList<Country> list = dataAccess.RetrieveQuery<Country>();
//return stuff
}
private IList<State> GetAllStates()
{
//return stuff
}
protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
{
IList<State> states = GetStateList(GetCountryList()[((DropDownList)sender).SelectedIndex]);
ddlStates.DataSource = states;
ddlStates.DataBind();
}
}
编辑: Viewstate在页面上,页面上的其他控件正确执行回发,而不是这个。
Viewstate是否已开启?
编辑:也许您应该重新考虑覆盖渲染功能
protected override void RenderContents(HtmlTextWriter output)
{
ddlCountries.RenderControl(output);
ddlStates.RenderControl(output);
}
而是将下拉列表添加到控件并使用默认的RenderContents呈现控件。
编辑:请参阅丹尼斯的答案,我在之前的评论中提到过:
Controls.Add ( ddlCountries );
Controls.Add ( ddlStates );
我无法看到您将这些控件添加到控件层次结构中。 尝试:
Controls.Add ( ddlCountries );
Controls.Add ( ddlStates );
除非控件是控件层次结构的一部分,否则不会调用事件。
您需要为Country DropDownList
将AutoPostBack
设置为true。
protected override void OnLoad(EventArgs e)
{
// base stuff
ddlCountries.AutoPostBack = true;
// other stuff
}
编辑
我错过了你做过这件事。 在这种情况下,您需要检查ViewState是否已启用。
我有同样的问题,但通过将AutoPostBack设置为true来绕过它,并在更新面板中将触发器设置为dropdownlist控件ID和事件名称为SelectedIndexChanged,例如
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always" enableViewState="true">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddl1" EventName="SelectedIndexChanged" />
</Triggers>
<ContentTemplate>
<asp:DropDownList ID="ddl1" runat="server" ClientIDMode="Static" OnSelectedIndexChanged="ddl1_SelectedIndexChanged" AutoPostBack="true" ViewStateMode="Enabled">
<asp:ListItem Text="--Please select a item--" Value="0" />
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
首先,我想澄清一些事情。 这是一个回发(回到服务器)永远不会发生,或者回发后发生,但它永远不会进入ddlCountry_SelectedIndexChanged事件处理程序?
我不确定你遇到了哪种情况,但如果是第二种情况,我可以提出一些建议。 如果是第一种情况,那么以下是FYI。
对于第二种情况(即使请求发生,事件处理程序也不会触发),您可能需要尝试以下建议:
请注意,在调用Control.DataBind()时,控件将不再提供查看状态和回发信息。 在视图状态为on的情况下,在post back之间,DropDownList的值将保持不变(列表不会被反弹)。 如果在OnLoad中发出另一个DataBind,它将清除其视图状态数据,并且永远不会触发SelectedIndexChanged事件。
在视图状态关闭的情况下,您别无选择,只能每次重新绑定列表。 发生回发时,有内部ASP.NET调用将值从Request.Params填充到适当的控件,我怀疑发生在OnInit和OnLoad之间。 在这种情况下,在OnInit中恢复列表值将使系统能够正确触发事件。
感谢您抽出时间阅读本文,如果我错了,欢迎大家纠正。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.