2012-05-30 69 views
1

我正在动态地将更改面板上的自定义用户控件添加到该列表中。我的用户控件包含两个下拉列表和一个文本框。当更新面板之外的控件触发回发时,我将用户控件重新添加到更新面板。Dropdownlist SelectedIndexChanged在每个回发中触发

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

任何想法?

如果需要,我可以发布代码,但在这种特殊情况下有相当多的内容。

在此先感谢!

编辑...代码下面加

* .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; } 
} 
+0

您至少应该发布相关的代码示例。 –

+0

设置断点并进行调试。这可能是另一种通过编程方式更改所选索引的方法。 –

+0

我数据绑定我的下拉回发,可以该数据绑定触发选定的索引更改? – s15199d

回答

0

,我发现我的答案在这个岗位.net DropDownList gets cleared after postback

我改变了我的柜台,我是在ViewState存储到一个会话变量。 然后我将我的reloadControls()函数从* .ASPX的Page_Load移动到Page_Init。

关键是动态地将我的用户控件添加到Page_Init中,因此在将Viewstate应用于页面上的控件之前它将成为页面的成员。

1

即使这已经得到解答,我想在这里提供答案,因为我最近纠结于这个问题,我找不到任何帮助我的答案,但是我在很多挖掘后找到了解决方案代码。

对我而言,发生这种情况的原因是由于某人覆盖PageStatePersister来更改视图状态隐藏字段的呈现方式。为什么这样做?我找到了我的答案here

当试图优化ASP.NET页面以更好地搜索引擎友好时,最大的问题之一是视图状态隐藏字段。大多数搜索引擎给文档的第一个[原文]成千上万个字节的内容提供更多的分数,所以如果你的第一个2 KB是查看状态垃圾,你的页面会受到惩罚。因此,这里的目标是尽可能降低视图状态数据。

我所遇到的代码是将__VIEWSTATE隐藏字段填空并在页面底部创建一个view_state隐藏字段。这样做的问题在于,它完全隐藏了视图状态,并且我得到的报告中显示的dropdownlists在不存在时会被更改,并且所有dropdownlists都会在提交时通过相同的处理程序。这是一团糟。我的解决方案是关闭这个页面上的这个自定义持有者,所以我不必补偿这些奇怪的事情。

protected override PageStatePersister PageStatePersister 
{ 
    get 
    { 
     if (LoginRedirectUrl == "/the_page_in_question.aspx") 
     { 
      return new HiddenFieldPageStatePersister(Page); 
     } 
     return new CustomPageStatePersister(this); 
    } 
} 

这使我有我需要它的页面的适当viewstate,但保留了网站其余部分的SEO代码。希望这可以帮助某人。

相关问题