我有一个列表框和用户控件的页面放在更新面板中,如下所示:
<%@ 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。
请记住,这是页面和用户控件的精简版本,因此人们可以专注于手头的问题,所以如果您需要更多详细信息,请问我...
代码流如下:
用户点击删除项目按钮并触发 页面中的btnDelete_Click()(第一次回发)
btnDelete_Click()调用userControl CMessage.MessageConfirm传递DeleteItem为 论证
在usercontrol上,MessageConfirm()显示modalpopup并保存 参数函数DeleteItem()以便稍后调用它(结束时) 第一次回发)
显示modalpopup后,用户单击其Ok按钮并且 触发usercontrol中的btnOk_Click()(第二次回发)
在usercontrol中,btnOk_Click()调用DeleteItem()函数 以前保存过的
在页面DeleteItem()从ListBox中删除项目(比方说 我不打电话给第二条消息来简化,这将是结束 第二个回发,更新面板没有刷新:S)
我认为我已经隔离了问题,将所有控件和函数从usercontrol移到了页面,问题仍然存在,但是如果我直接调用DeleteItem()函数而不是他的委托它就可以了(请记住在两种情况下,DeleteItem()的断点都被触发,因此函数代码正确执行了:
protected void btnOk_Click(object sender, EventArgs e)
{
ModalPopupMenssage.Hide();
/*if (FunctionButtonPressedOk!= null)
{
FunctionButtonPressedOk();
}*/
DeleteItem(); //page updates correctly! why?
}
是否与代表有些不兼容?
答案 0 :(得分:0)
最后我解决了它改变以下几行:
if (FunctionButtonPressedOk!= null)
{
//FunctionButtonPressedOk();
Page.GetType().InvokeMember(FunctionButtonPressedOk.Method.Name, BindingFlags.InvokeMethod, null, Page, new []{sender, e});
}
为什么它以这种方式运作?内部差异是什么?