ASP.NET:自定义控件重新加载整页

时间:2010-08-04 14:56:06

标签: c# asp.net

我正在使用C#代码在ASP.NET网站上工作。 现在,当我以编程方式创建自定义控件时,麻烦就开始了。控件显示在面板中,但是当我单击控件的其中一个按钮时,它什么都不做。如果我单击它们两次,则用户控件将消失。 使用调试器,我发现它正在进行回发,这很奇怪,因为我尝试使用按钮并将usesubmitbehavior设置为false;它还在发送回传。

以下是在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>

按钮调用的方法应该将标签testLabel的文本从“bbbbbbbbbbbbb”更改为“aaaaaaaaaaa”。我修改文本后显然正在做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();

我查看了互联网并没有找到任何东西。

2 个答案:

答案 0 :(得分:1)

我不确定动态添加控件的代码究竟在哪里,但必须在每次回发时调用它以重新添加控件。你不能只添加一次而忘记它。当您回发时,页面将使用您的aspx页面中的标记重新呈现(显然没有动态控件)。动态添加的控件中的值仍将在ViewState中,但不会重新呈现控件。

答案 1 :(得分: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属性。