C# Dropdownlist SelectedIndexChanged在每次回发时触发

C# Dropdownlist SelectedIndexChanged在每次回发时触发,c#,asp.net,C#,Asp.net,我正在向更新面板动态添加自定义用户控件。我的用户控件包含两个下拉列表和一个文本框。当更新面板外的控件触发postsback时,我将用户控件重新添加到更新面板 问题是…在回发时,当我重新添加用户控件时,它会触发用户控件内DropDownList的“SelectedIndexChanged”事件。即使所选索引自上次回发后没有更改 有什么想法吗 如果有必要,我可以发布代码,但在这个特定场景中有相当多的内容 提前谢谢 编辑…代码添加到下面 *.ASCX <asp:DropDownList ID="

我正在向更新面板动态添加自定义用户控件。我的用户控件包含两个下拉列表和一个文本框。当更新面板外的控件触发postsback时,我将用户控件重新添加到更新面板

问题是…在回发时,当我重新添加用户控件时,它会触发用户控件内DropDownList的“SelectedIndexChanged”事件。即使所选索引自上次回发后没有更改

有什么想法吗

如果有必要,我可以发布代码,但在这个特定场景中有相当多的内容

提前谢谢

编辑…代码添加到下面

*.ASCX

<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