如何动态交换ascx控件?

时间:2009-07-24 00:31:45

标签: asp.net updatepanel ascx

我有一个aspx。

<div id="headerRegion" class="borderDiv">
    <xy:paymentHeader id="paymentHeader1" runat="server" />
</div>
<div id="paymentRegion" class="borderDiv">
    <asp:UpdatePanel ID="paymentFormUpdater" runat="server">
        <ContentTemplate>
            <asp:PlaceHolder runat="server" ID="plcPaymentForm" />
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

在init页面上,placeHolder加载了一个ascx。

private Control GetPaymentControl(char? coverageBenefitPeriod)
{
    Control paymentCtl = null;
    switch (coverageBenefitPeriod)
    {
        case 'L':
            paymentCtl = this.LoadControl("~/Controls/Lumpform.ascx");
            break;
        case 'W':
            paymentCtl = this.LoadControl("~/Controls/Periodicform.ascx");
            break;
        default:
            paymentCtl = this.LoadControl("~/Controls/Lumpform.ascx");
            break;
    }
    return paymentCtl;
}
plcPaymentForm.Controls.Add(control);

paymentHeader1控件上有一个radioButton List。当我切换那个单选按钮想在占位符“plcPaymentForm”中优雅地在Periodicform.ascx和Lumpform.ascx之间交换。我该怎么做呢?我试图不加载两个控件并切换其可见性。如果你有任何想法如何正确地做到这一点,最小的页面中断,请指出我正确的方向。

谢谢,〜来自圣地亚哥

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

protected void rbl_Changed(object sender, EventArgs e)
{
    if(rbl.SelectedItem.Text == "Periodicform")
        Page.FindControl("plcPaymentForm") = LoadControl("Periodicform.ascx");
    else if(rbl.SelectedItem.Text == "Lumpform")
        Page.FindControl("plcPaymentForm") = LoadControl("Lumpform.ascs");
}

答案 1 :(得分:0)

在Init上,您需要加载当前显示的那个,否则viewstate将无法加载。然后在单选按钮更改事件的事件处理程序上(假设您已启用自动回发并对必要的AJAX触发器进行排序),按照您的方式加载新的paymentCtl,但在添加之前清除plcPaymentForm.Controls集合。< / p>

如果需要,可以在UpdatePanel上调用Update()(或者是Refresh())来强制从其外部的控件刷新其内容,或者在每次回发时将其设置为刷新,具体取决于控制和你正在做的回发。