C# Dropdownlist SelectedIndexChanged在每次回发时触发
我正在向更新面板动态添加自定义用户控件。我的用户控件包含两个下拉列表和一个文本框。当更新面板外的控件触发postsback时,我将用户控件重新添加到更新面板 问题是…在回发时,当我重新添加用户控件时,它会触发用户控件内DropDownList的“SelectedIndexChanged”事件。即使所选索引自上次回发后没有更改 有什么想法吗 如果有必要,我可以发布代码,但在这个特定场景中有相当多的内容 提前谢谢 编辑…代码添加到下面 *.ASCXC# Dropdownlist SelectedIndexChanged在每次回发时触发,c#,asp.net,C#,Asp.net,我正在向更新面板动态添加自定义用户控件。我的用户控件包含两个下拉列表和一个文本框。当更新面板外的控件触发postsback时,我将用户控件重新添加到更新面板 问题是…在回发时,当我重新添加用户控件时,它会触发用户控件内DropDownList的“SelectedIndexChanged”事件。即使所选索引自上次回发后没有更改 有什么想法吗 如果有必要,我可以发布代码,但在这个特定场景中有相当多的内容 提前谢谢 编辑…代码添加到下面 *.ASCX <asp:DropDownList ID="
<asp:DropDownList ID="ddlColumns" OnSelectedIndexChanged="ddlColumns_SelectedChanged" AppendDataBoundItems="true" AutoPostBack="true" runat="server">
<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...
*.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
}
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; }
}
List dataColumns=new List();
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
填充列();
}
}
public void fillDataColumnsList()
{
dataColumns.Clear();
//COMMON GETDATATABLE返回由存储的PROC命令的结果填充的数据表
DataTable dt=common.getDataTable(storedProcs.SELECT_COLUMNS,new List());
foreach(数据行dr在dt.行中)
{
添加(新的dataColumnSpecs(dr[“columnName”].ToString()、dr[“friendlyName”].ToString()、dr[“dataType”].ToString()、(int)dr[“dataSize”]);
}
}
公共void fillddl列()
{
fillDataColumnsList();
ddlColumns.Items.Clear();
foreach(dataColumnSpecs数据列中的dcs)
{
ListItem li=新的ListItem();
li.Text=dcs.friendlyName;
li.Value=dcs.columnName;
ddlColumns.Items.Add(li);
}
ddlColumns.Items.Insert(0,newlistItem(“-选择列-”,”);
ddlColumns.DataBind();
}
受保护的无效列\u SelectedChanged(对象发送方,事件参数e)
{
//单击父*.ASPX上的按钮时,将触发此代码
}
*.ASPX
<asp:DropDownList ID="ddlColumns" OnSelectedIndexChanged="ddlColumns_SelectedChanged" AppendDataBoundItems="true" AutoPostBack="true" runat="server">
<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...
我在这篇文章中找到了答案
我将存储在viewstate中的计数器更改为会话变量。
然后,我将reloadControls()函数从*.ASPX的Page_Load移到Page_Init
关键是在页面初始化中动态添加我的用户控件,以便在Viewstate应用于页面上的控件之前它将成为页面的成员。我在这篇文章中找到了答案
我将存储在viewstate中的计数器更改为会话变量。
然后,我将reloadControls()函数从*.ASPX的Page_Load移到Page_Init
关键是动态地将我的用户控件添加到页面_Init中,以便在Viewstate应用于页面上的控件之前它将成为页面的一员。即使这已经得到了回答,但我想在这里给出一个答案,因为我最近遇到了这个问题,我在任何地方都找不到对我有帮助的答案,但我确实找到了一个答案在对代码进行了大量挖掘之后,我们找到了解决方案
对我来说,发生这种情况的原因是有人覆盖了PageStatePersister以更改viewstate隐藏字段的呈现方式。为什么这样做?我找到了答案
当试图优化ASP.NET页面以使其对搜索引擎更友好时,最大的问题之一是视图状态隐藏字段。大多数搜索引擎对文档的前数千字节的内容给予更高的分数,因此如果您的前2kb是视图状态垃圾,您的页面将受到惩罚。因此,这里的目标是尽可能向下移动视图状态数据
我遇到的代码是清空uu VIEWSTATE隐藏字段,并在页面底部创建一个VIEWSTATE隐藏字段。问题是它完全破坏了viewstate,我得到了DropDownList报告,当它们没有被更改时,它们被报告为被更改,并且所有DropDownList在提交时都通过相同的处理程序。真是一团糟。我的解决方案是关闭这个页面上的自定义持久化程序,这样我就不必补偿所有这些奇怪之处
protected override PageStatePersister PageStatePersister
{
get
{
if (LoginRedirectUrl == "/the_page_in_question.aspx")
{
return new HiddenFieldPageStatePersister(Page);
}
return new CustomPageStatePersister(this);
}
}
这使我能够为我需要的页面设置适当的viewstate,但保留了站点其余部分的SEO代码。希望这对某人有所帮助。尽管这已经得到了回答,但我想在这里给出一个答案,因为我最近卷入了这个问题,我在任何地方都找不到一个对我有帮助的答案,但在深入研究代码之后,我确实找到了一个解决方案
对我来说,发生这种情况的原因是有人覆盖了PageStatePersister以更改viewstate隐藏字段的呈现方式。为什么这样做?我找到了答案
当试图优化ASP.NET页面以使其对搜索引擎更友好时,最大的问题之一是视图状态隐藏字段。大多数搜索引擎对文档的前数千字节的内容给予更高的分数,因此如果您的前2kb是视图状态垃圾,您的页面将受到惩罚。因此,这里的目标是尽可能向下移动视图状态数据
我遇到的代码是清空uu VIEWSTATE隐藏字段,并在页面底部创建一个VIEWSTATE隐藏字段。问题是它完全破坏了viewstate,我得到了DropDownList报告,当它们没有被更改时,它们被报告为被更改,并且所有DropDownList在提交时都通过相同的处理程序。真是一团糟。我的解决方案是关闭这个页面上的自定义持久化程序,这样我就不必补偿所有这些奇怪之处
protected override PageStatePersister PageStatePersister
{
get
{
if (LoginRedirectUrl == "/the_page_in_question.aspx")
{
return new HiddenFieldPageStatePersister(Page);
}
return new CustomPageStatePersister(this);
}
}
这使我能够为我需要的页面设置适当的viewstate,但保留了站点其余部分的SEO代码。希望这对其他人有所帮助。您至少应该发布相关的代码示例。设置断点并进行调试。这可能是另一种通过编程更改选定索引的方法。我正在回发时对下拉列表进行数据绑定,该数据绑定是否会触发选定索引的更改?是的,t