0

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

<%@ 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>

用户控件代码隐藏是这样的:

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();
    }
}

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

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

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

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

代码流程是这样的:

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

  2. btnDelete_Click() 调用用户控件 CMessage.MessageConfirm 传递 DeleteItem 作为参数

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

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

  5. 在用户控件 btnOk_Click() 调用之前保存的 DeleteItem() 函数

  6. 在页面 DeleteItem() 从 ListBox 中删除项目(假设我不调用第二条消息来简化,这将是第二次回发的结束,并且更新面板尚未刷新:S)

我想我已经隔离了问题,将所有控件和函数从用户控件移动到页面,问题仍然存在,但是如果我直接调用 DeleteItem() 函数而不是他的委托它工作(请记住,在这两种情况下DeleteItem() 处的断点已触发,因此函数代码正确执行):

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

与代表有一些不兼容吗?

4

1 回答 1

0

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

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

为什么它会这样工作?内部有什么区别?

于 2012-05-16T08:35:58.117 回答