2010-08-04 78 views
0

我正在使用C#代碼處理ASP.NET網站。 現在,當我以編程方式創建自定義控件時,麻煩就開始了。該控件顯示在面板中,但是當我點擊控件的其中一個按鈕時,它什麼也不做。如果我點擊他們兩次,用戶控件消失。 使用調試器,我發現它正在做回發,這很奇怪,因爲我嘗試使用按鈕並將usesubmitbehavior設置爲false;它仍然發送回傳。ASP.NET:自定義控件重新加載整頁

這裏就是控制插在default.aspx文件

<asp:UpdatePanel runat="server" ID="contentHolderUpdatePanel" 
       UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Panel runat="server" ID="contentPanel"> 
     </asp:Panel> 
    </ContentTemplate> 
</asp:UpdatePanel> 

這裏是從控制的ListadoAuditoria的ASPX。

<asp:UpdatePanel runat="server" ID="auditorTableUpdatePanel" UpdateMode="Conditional"> 
<ContentTemplate> 
    <asp:Table runat="server" ID="auditorTable" BorderWidth="0" Width="100%"> 
     <asp:TableHeaderRow HorizontalAlign="Center"> 
      <asp:TableHeaderCell>Button 
      </asp:TableHeaderCell> 
     </asp:TableHeaderRow> 
    </asp:Table> 
</ContentTemplate> 
</asp:UpdatePanel> 
<asp:UpdatePanel runat="server" ID="formHolderUpdatePanel" UpdateMode="Conditional"> 
<ContentTemplate> 
<asp:Label runat="server" ID="testLabel" Text="bbbbbbbbbbbbb" ></asp:Label> 
</ContentTemplate> 
</asp:UpdatePanel> 

該按鈕調用應該從「bbbbbbbbbbbbb」到「AAAAAAAAAAA」標籤testLabel的文本改變的方法。顯然,我在修改文本後正在執行auditorTableUpdatePanel.Update()

控制CS

protected void Page_Load(object sender, EventArgs e) 
    { 
     loadAudits(); 
    } 

    public void loadAudits() 
    { 

     for(int i=0;i<10;++i) 
     { 
      TableRow row = new TableRow(); 

      TableCell cell1 = new TableCell(); 

      ImageButton deleteButton = new ImageButton(); 
      deleteButton.ImageUrl = "~/image.gif"; 
      deleteButton.Click += generateNewPart; 
      deleteButton.EnableViewState = true; 
      deleteButton.ID = i.ToString(); 

      cell1.Controls.Add(deleteButton); 

      row.Cells.Add(cell1); 

      auditorTable.Rows.Add(row); 

     } 
    } 

    public void generateNewPart(object sender, EventArgs e) 
    { 
     tumadre.Text = "aaaaaaaaaaaa"; 
     formHolderUpdatePanel.Update(); 
    } 

這裏是代碼時,我產生了控制,並將其插入面板:

Panel panel = (Panel)Page.FindControl("contentPanel"); 
UpdatePanel updatePanel = (UpdatePanel)Page.FindControl("contentHolderUpdatePanel"); 
ListadoAuditorias listadoAuditorias = (ListadoAuditorias)LoadControl("~/CargaDeAuditoria/ListadoAuditorias.ascx"); 
panel.Controls.Add(listadoAuditorias); 
updatePanel.Update(); 

我看着在互聯網上,並沒有發現任何東西。

+0

您發佈的html中不存在'contentPanel'或'contentHolderUpdatePanel'。 – fearofawhackplanet 2010-08-04 15:03:02

+0

我可以把它放在它所在的位置,如果它需要的話 – ShinyDarkStone 2010-08-04 15:13:37

+0

如果你能用一個非常簡單的例子重新創建問題,那麼最好的辦法是讓人們更容易看到發生了什麼。你會得到更多的幫助。 – fearofawhackplanet 2010-08-04 15:15:56

回答

1

我不確定動態添加控件的代碼在哪裏,但必須在每次回發時調用它以重新添加控件。你不能只添加一次而忘記它。當你回傳時,頁面將會在你的aspx頁面中重新渲染(它顯然沒有你的動態控件)。動態添加的控件的值仍然在ViewState中,但控件不會被重新渲染。

+0

tnx,它像一個魅力工作! – ShinyDarkStone 2010-08-04 16:05:34

+0

真棒 - 很高興它的工作 – 2010-08-04 16:09:44

0

我不完全確定我在看什麼;我不知道「控件的代碼」是否是您加載的ListadoAuditorias控件的代碼。如果是這樣,我沒有注意到任何按鈕。

所以我可能在這裏是錯誤的,但彈出的第一件事是,它看起來像你正在加載ListadoAuditorias控件,然後將其添加到正常的Panel控件。如果ListadoAuditorias中的其中一個控件觸發回發,並且它不包含在UpdatePanel中,那麼是的,我希望該頁面會執行回發和重新加載,除非您已指定ChildrenAsTriggers和UpdateMode屬性不是他們的默認值(我認爲)。所以我只是建議你看看你添加控件的位置。確保它們包含在UpdatePanel中,如果這就是你的意圖。

此外,請注意Button控件的UseSubmitBehavior屬性不會阻止按鈕啓動回發。該屬性僅確定按鈕是否呈現爲<input type="submit" /><input type="button" />。在後一種情況下(當您將UseSubmitBehavior設置爲false時),控件仍會在HTML元素的onclick屬性中呈現JavaScript以導致回發。

編輯:我修改了我的關於UpdatePanel控件的解釋,提到了ChildrenAsTriggers和UpdateMode屬性。

+0

我編輯我的帖子,把所有的控制代碼和default.aspx – ShinyDarkStone 2010-08-04 15:40:21