2012-05-30 95 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代碼。希望這可以幫助某人。

相關問題