我有一个带有列表框的页面和一个放置在更新面板中的用户控件,如下所示:
<%@ 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。
请记住,这是页面和用户控件的精简版本,因此人们可以专注于手头的问题,所以如果您需要更多详细信息,请咨询我...
代码流程是这样的:
用户点击删除项目按钮并触发页面中的btnDelete_Click()(第一次回发)
btnDelete_Click() 调用用户控件 CMessage.MessageConfirm 传递 DeleteItem 作为参数
在用户控件 MessageConfirm() 显示 modalpopup 并保存参数函数 DeleteItem() 以便稍后调用它(第一次回发结束)
显示 modalpopup 后,用户单击其 Ok 按钮并触发用户控件中的 btnOk_Click()(第二次回发)
在用户控件 btnOk_Click() 调用之前保存的 DeleteItem() 函数
在页面 DeleteItem() 从 ListBox 中删除项目(假设我不调用第二条消息来简化,这将是第二次回发的结束,并且更新面板尚未刷新:S)
我想我已经隔离了问题,将所有控件和函数从用户控件移动到页面,问题仍然存在,但是如果我直接调用 DeleteItem() 函数而不是他的委托它工作(请记住,在这两种情况下DeleteItem() 处的断点已触发,因此函数代码正确执行):
protected void btnOk_Click(object sender, EventArgs e)
{
ModalPopupMenssage.Hide();
/*if (FunctionButtonPressedOk!= null)
{
FunctionButtonPressedOk();
}*/
DeleteItem(); //page updates correctly! why?
}
与代表有一些不兼容吗?