在UserControl内的modalpopup内单击Button事件后刷新UpdatePanel

时间:2012-05-14 15:34:16

标签: c# asp.net updatepanel ajaxcontroltoolkit modalpopupextender

我有一个列表框和用户控件的页面放在更新面板中,如下所示:

<%@ Register TagPrefix="uc1" TagName="CMessage" Src="~/Controls/CMessage.ascx" %>
<ajaxToolkit:ToolkitScriptManager runat="server" ID="ToolkitScriptManager1" EnableScriptGlobalization="true" EnableScriptLocalization="true" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:ListBox ID="lbox" runat="server"></asp:ListBox>
            <asp:Button ID="btnDelete" OnClick="btnDelete_Click" runat="server" Text="Delete selected item" Enabled="True"></asp:Button>
            <uc1:CMessage ID="CMessage1" runat="server" />
        </ContentTemplate>
    </asp:UpdatePanel>

页面代码隐藏是这样的:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        lbox.Items.Add("test1");
        lbox.Items.Add("test2");
    }
}
protected void btnDelete_Click(object sender, EventArgs e)
{
    CMessage.MessageConfirm("Delete item?", "Yes", "No", DeleteItem);
}
protected void DeleteItem()
{
  lbox.Items.Remove(lbox.SelectedItem);
  CMessage.Message("Item deleted succesfully!");
}

用户控件是这样的:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CMessage.ascx.cs" Inherits="Controles.CMessage" %>
    <table id="tableMessage" runat="server" style="display: none" class="modalPopup">
        <tr>
            <td>
                <asp:Label ID="lb5" runat="server" Text="Message"></asp:Label>
            </td>
        </tr>
        <tr>
            <td>
                <asp:Label ID="lbMessage" runat="server"></asp:Label>
            </td>
        </tr>
        <tr>
            <td>
                <asp:Button ID="btnOk" runat="server" Text="Ok" OnClick="btnOk_Click" />
                <asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClick="btnCancel_Click" />
            </td>
        </tr>
   </table>
   <asp:Button ID="btnOKError" runat="server" Text="OK" style="display: none" />    
   <ajaxToolkit:ModalPopupExtender ID="ModalPopupMessage" runat="server" TargetControlID="btnOKError" PopupControlID="tableMessage" OkControlID="btnOKError" CancelControlID="btnOKError"></ajaxToolkit:ModalPopupExtender>

usercontrol代码隐藏是这样的:

public partial class CMensaje : UserControl
{
    public delegate void FunctionButtonPressed();

    private FunctionButtonPressed FunctionButtonPressedOk
    {
        get { return (FunctionButtonPressed)Session["FunctionButtonPressedOk"]; }
        set { Session["FunctionButtonPressedOk"]= value; }
    }
    protected void btnOk_Click(object sender, EventArgs e)
    {
        ModalPopupMenssage.Hide();
        if (FunctionButtonPressedOk!= null)
        {
            FunctionButtonPressedOk();
        }
    }
    protected void btnCancel_Click(object sender, EventArgs e)
    {
        ModalPopupMessage.Hide();
    }
    public void Mensaje(string message)
    {
        lbMessage.Text = message;
        FunctionButtonPressedOk= null;
        btnCancel.Visible = false;
        ModalPopupMessage.Show();
    }
    public void MessageConfirm(string message, FunctionButtonPressed FunButtonOkx)
    {
        lbMessage.Text = message;
        FunctionButtonPressedOk= FunBotonAceptarx;
        btnCancel.Visible = true;
        ModalPopupMensaje.Show();
    }
}

一切正常,显示弹出窗口,从页面调用的函数传递给usercontrol,如果用户按下ok并正确触发等,则触发它。但是在最后一个函数DeleteItem()中对页面所做的更改(在此示例中,从列表框中删除的项目和启动的通知消息)不起作用。

就像updatepanel没有刷新一样。我不能手动调用UpdatePanel1.Update(),因为我一如既往地拥有updatemode。理论上,在页面周期的这一部分,它应该用更改刷新页面......

我尝试在用户控件页面中添加OK按钮作为UpdatePanel的PostBackTrigger但无效并且作为AsyncPostBackTrigger。

请记住,这是页面和用户控件的精简版本,因此人们可以专注于手头的问题,所以如果您需要更多详细信息,请问我...

代码流如下:

  1. 用户点击删除项目按钮并触发 页面中的btnDelete_Click()(第一次回发)

  2. btnDelete_Click()调用userControl CMessage.MessageConfirm传递DeleteItem为 论证

  3. 在usercontrol上,MessageConfirm()显示modalpopup并保存 参数函数DeleteItem()以便稍后调用它(结束时) 第一次回发)

  4. 显示modalpopup后,用户单击其Ok按钮并且 触发usercontrol中的btnOk_Click()(第二次回发)

  5. 在usercontrol中,btnOk_Click()调用DeleteItem()函数 以前保存过的

  6. 在页面DeleteItem()从ListBox中删除项目(比方说 我不打电话给第二条消息来简化,这将是结束 第二个回发,更新面板没有刷新:S)

  7. 我认为我已经隔离了问题,将所有控件和函数从usercontrol移到了页面,问题仍然存在,但是如果我直接调用DeleteItem()函数而不是他的委托它就可以了(请记住在两种情况下,DeleteItem()的断点都被触发,因此函数代码正确执行了:

    protected void btnOk_Click(object sender, EventArgs e)
        {
            ModalPopupMenssage.Hide();
            /*if (FunctionButtonPressedOk!= null)
            {
                FunctionButtonPressedOk();
            }*/
            DeleteItem(); //page updates correctly! why?
        }
    

    是否与代表有些不兼容?

1 个答案:

答案 0 :(得分:0)

最后我解决了它改变以下几行:

if (FunctionButtonPressedOk!= null)
        {
            //FunctionButtonPressedOk();
            Page.GetType().InvokeMember(FunctionButtonPressedOk.Method.Name, BindingFlags.InvokeMethod, null, Page, new []{sender, e});
        }

为什么它以这种方式运作?内部差异是什么?