[英]Dropdownlist SelectedIndexChanged firing on every postback
我正在向更新面板动态添加自定义用户控件。 我的用户控件包含两个下拉列表和一个文本框。 当更新面板外部的控件触发回发时,我正在将用户控件重新添加到更新面板。
问题是...回发时,当我重新添加用户控件时,它触发了用户控件中下拉列表的“ SelectedIndexChanged”事件。 即使selectedindex自上次回发以来没有变化。
有任何想法吗?
如有必要,我可以发布代码,但是在这种特定情况下有很多事情。
提前致谢!
编辑...代码如下
* .ASCX
<asp:DropDownList ID="ddlColumns" OnSelectedIndexChanged="ddlColumns_SelectedChanged" AppendDataBoundItems="true" AutoPostBack="true" runat="server">
* .ASCX.CS
List<dataColumnSpecs> dataColumns = new List<dataColumnSpecs>();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
fillDDLColumns();
}
}
public void fillDataColumnsList()
{
dataColumns.Clear();
//COMMON GETDATATABLE RETURNS A DATA TABLE POPULATED WITH THE RESULTS FROM THE STORED PROC COMMAND
DataTable dt = common.getDataTable(storedProcs.SELECT_COLUMNS, new List<SqlParameter>());
foreach (DataRow dr in dt.Rows)
{
dataColumns.Add(new dataColumnSpecs(dr["columnName"].ToString(), dr["friendlyName"].ToString(), dr["dataType"].ToString(), (int)dr["dataSize"]));
}
}
public void fillDDLColumns()
{
fillDataColumnsList();
ddlColumns.Items.Clear();
foreach (dataColumnSpecs dcs in dataColumns)
{
ListItem li = new ListItem();
li.Text = dcs.friendlyName;
li.Value = dcs.columnName;
ddlColumns.Items.Add(li);
}
ddlColumns.Items.Insert(0, new ListItem(" -SELECT A COLUMN- ", ""));
ddlColumns.DataBind();
}
protected void ddlColumns_SelectedChanged(object sender, EventArgs e)
{
//THIS CODE IS BEING FIRED WHEN A BUTTON ON THE PARENT *.ASPX IS CLICKED
}
* .ASPX
<asp:UpdatePanel ID="upControls" runat="server">
<ContentTemplate>
<asp:Button ID="btnAddControl" runat="server" Text="+" OnClick="btnAddControl_Click" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="btnGo" runat="server" Text="Go" OnClick="btnGo_Click" ValidationGroup="vgGo" />
<asp:GridView...
* .ASPX.CS
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
uc_Counter = 0;
addControl();
gridview_DataBind();
}
else
{
reloadControls();
}
}
protected void btnGo_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
//THIS BUTTON CLICK IS WHAT'S TRIGGERING THE
//SELECTEDINDEXCHANGED EVENT TO FIRE ON MY *.ASCX
gridview_DataBind();
}
}
private void reloadControls()
{
int count = this.uc_Counter;
for (int i = 0; i < count; i++)
{
Control myUserControl = Page.LoadControl("~/Controls/myUserControl.ascx");
myUserControl.ID = "scID_" + i;
upControls.ContentTemplateContainer.Controls.AddAt(i, myUserControl);
((customUserControl)myUserControl).fillDDLColumns();
}
}
private void addControl()
{
Control myUserControl = Page.LoadControl("~/Controls/myUserControl.ascx");
myUserControl.ID = "scID_" + uc_Counter.ToString();
upControls.ContentTemplateContainer.Controls.AddAt(upControls.ContentTemplateContainer.Controls.IndexOf(btnAddControl), myUserControl);
//((customUserControl)myUserControl).fillDDLColumns();
this.uc_Counter++;
}
protected int uc_Counter
{
get { return (int)ViewState["uc_Counter"]; }
set { ViewState["uc_Counter"] = value; }
}
尽管已经回答了这个问题,但是由于我最近已经解决了这个问题,所以我想在这里给出答案,并且找不到任何对我有帮助的答案,但是在深入研究代码之后,我确实找到了解决方案。
对我来说,发生这种情况的原因是由于有人重写PageStatePersister来更改显示状态隐藏字段的方式。 为什么这样 我在这里找到了答案。
试图优化ASP.NET页面以使其对搜索引擎更友好时,最大的问题之一就是视图状态隐藏字段。 大多数搜索引擎会为文档的前几千个字节的内容提供更高的分数,因此,如果您的前2 KB是视图状态垃圾,则您的页面将受到惩罚。 因此,这里的目标是尽可能降低视图状态数据。
我遇到的代码所做的是将__VIEWSTATE隐藏字段清空,并在页面底部创建一个view_state隐藏字段。 这样做的问题是,它完全破坏了视图状态,并且我收到下拉列表被报告为在不更改时被更改的信息,并且所有下拉列表在提交时都经过相同的处理程序。 一团糟。 我的解决方案是仅在此页面上关闭此自定义持久程序,这样我就不必补偿所有这些怪异现象。
protected override PageStatePersister PageStatePersister
{
get
{
if (LoginRedirectUrl == "/the_page_in_question.aspx")
{
return new HiddenFieldPageStatePersister(Page);
}
return new CustomPageStatePersister(this);
}
}
这使我能够在需要的页面上拥有正确的视图状态,但保留了该网站其余部分的SEO代码。 希望这对某人有帮助。
我在这篇文章中找到了答案。 回发后, .net DropDownList被清除了
我将存储在viewstate中的计数器更改为会话变量。 然后,我将reloadControls()函数从* .ASPX的Page_Load移到了Page_Init。
关键是在Page_Init中动态添加我的用户控件,因此在将Viewstate应用于页面上的控件之前,它将成为页面的成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.