【问题标题】:Can a userControl event cause an update panel to refresh?userControl 事件能否导致更新面板刷新?
【发布时间】:2010-11-13 12:20:44
【问题描述】:

我有一个 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>

在页面初始化时,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 控件上有一个单选按钮列表。当我切换该单选按钮时,我想优雅地在占位符“plcPaymentForm”中的 Periodicform.ascx 和 Lumpform.ascx 之间切换。我该如何正确地做到这一点?我试图不加载两个控件并切换它们的可见性。如果您有任何想法如何以最少的页面中断正确执行此操作,请指出正确的方向。

谢谢, ~ck 在圣地亚哥

【问题讨论】:

    标签: c# asp.net-ajax user-controls updatepanel


    【解决方案1】:

    我看到了三个快速而肮脏的想法:

    1. 您可以将单选按钮列表设置为自动回发,然后将事件冒泡,以便 xy:paymentHeader 可以用作更新面板的触发器。
    2. 让 xy:paymentHeader 引发事件并在事件处理程序中调用 updatepanel 的 Update 方法。
    3. 将 updatepanel 的 id 传递给控件,​​并使用 find 控件找到 updatpanel 并调用其更新方法。

    示例(#1):


    用户控制:

    protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string value = ((RadioButtonList)sender).SelectedValue;
        char? c = null;
        if (!string.IsNullOrEmpty(value))
        {
            c = value[0];
        }
        RaiseBubbleEvent(this, new CommandEventArgs("SelectedIndexChanged", c));
    }
    

    页面:

    protected override bool OnBubbleEvent(object source, EventArgs args)
    {
        if (args is CommandEventArgs)
        {
            CommandEventArgs cArgs = (CommandEventArgs)args;
            if (cArgs.CommandName == "SelectedIndexChanged")
            {
                Control c = GetPaymentControl((char?)cArgs.CommandArgument);
                // ...
                updatePanel.Update();
                return true;
            }
        }
        return base.OnBubbleEvent(source, args);
    }
    

    【讨论】:

    • 此外,即使您成功执行了更新,您也可能会遇到 ViewState 问题,因为控制树已更改。
    • 感谢 drs9222,这是一个可行的解决方案。我喜欢接触 OnBubbleEvent。我还没来得及玩那个。谢谢! ~ck
    【解决方案2】:

    drs9222 回答的内容略有不同。
    1. 声明一个委托

    Public delegate void UserControlFormSubmit(object sender, EventArgs e);
    

    2. 在 UserControlFormSubmit 类型的用户控件内声明一个事件

    Public event UserControlFormSubmit OnFormSubmit;
    

    3.将用户控制事件设置为更新面板的触发器,如下所示

    <asp:UpdatePanel ID="paymentFormUpdater" runat="server" UpdateMode=”Conditional” ChildrenAsTriggers=”true”> 
    <ContentTemplate> 
        <asp:PlaceHolder runat="server" ID="plcPaymentForm" /> 
    </ContentTemplate> 
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="paymentHeader1"            EventName="OnFormSubmit" />
    

    4. 当radioButtonList 发生selectedindexchange 事件时,引发事件OnFormSubmit。 (请注意,如 drs9222 所述,您需要为 radioButtonList 设置 AutoPostBack=true。

    【讨论】:

    • 是的,维奈先生。这正是我最终要做的。感谢您的跟进!
    • 我必须将第 2 步修改为以下内容才能使其正常工作 Public event EventHandler OnFormSubmit;
    猜你喜欢
    • 2014-09-15
    • 2015-01-14
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2012-07-09
    相关资源
    最近更新 更多