C# 如果委托调用函数,则UpdatePanel不会反映更改
有了下面的设置,如果通过委托/事件处理程序更改标签文本,为什么更新面板不反映标签文本的更改?你会怎么做 Test.aspx:C# 如果委托调用函数,则UpdatePanel不会反映更改,c#,asp.net,updatepanel,ajaxcontroltoolkit,modalpopupextender,C#,Asp.net,Updatepanel,Ajaxcontroltoolkit,Modalpopupextender,有了下面的设置,如果通过委托/事件处理程序更改标签文本,为什么更新面板不反映标签文本的更改?你会怎么做 Test.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" EnableEventValidation="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test"
EnableEventValidation="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Test</title>
</head>
<body style="text-align: center">
<form id="form1" runat="server">
<ajaxToolkit:ToolkitScriptManager runat="server" ID="ToolkitScriptManager1" EnableScriptGlobalization="true"
EnableScriptLocalization="true" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Example label"></asp:Label>
<asp:Button ID="btnChange" OnClick="btnChange_Click" runat="server" Text="Change">
</asp:Button>
<table id="tableMessage" runat="server" style="display: none" >
<tr>
<td>
<asp:Label ID="lb5" runat="server" Text="Warning"></asp:Label>
</td>
</tr>
<tr>
<td >
<asp:Label ID="lbMessage" runat="server"></asp:Label><br />
</td>
</tr>
<tr>
<td>
<asp:Button ID="btnOk" runat="server" AccessKey="a" Font-Bold="True" Text="Ok"
Width="125px" OnClick="btnOk_Click" />
<asp:Button ID="btnCancel" runat="server" AccessKey="C" Font-Bold="True" Text="Cancel"
Width="125px" 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" DropShadow="true">
</ajaxToolkit:ModalPopupExtender>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
试验
Test.aspx.cs:
using System;
using System.Web.UI;
using AsistenciasCapadatos;
public partial class Test : Page
{
private EventHandler OkButtonClick
{
get { return SessionActual.Get<EventHandler>("OkButtonClick"); }
set { SessionActual.Set("OkButtonClick", value); }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnChange_Click(object sender, EventArgs e)
{
MessageConfirm("Do you want to change label?", btnChange1_Click);
}
protected void btnChange1_Click(object sender, EventArgs e)
{//the text property changes correctly but the updatepanel doesnt reflect it...viewstate ajax bug?
Label1.Text = "Change1";
}
protected void btnChange2_Click(object sender, EventArgs e)
{
Label1.Text = "Change2";
}
protected void btnOk_Click(object sender, EventArgs e)
{
//Label1.Text = "Change1"; //this way works
OkButtonClick.Invoke(sender, e); //this doesnt
}
protected void btnCancel_Click(object sender, EventArgs e)
{
}
public void MessageConfirm(string message, EventHandler btnclick)
{
OkButtonClick = btnclick;
lbMessage.Text = message;
ModalPopupMessage.Show();
}
}
使用系统;
使用System.Web.UI;
使用AsistenciasCapadatos;
公共部分类测试:第页
{
私有事件处理程序OK按钮单击
{
get{return SessionActual.get(“OkButtonClick”);}
set{SessionActual.set(“OkButtonClick”,value);}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的无效b更改\u单击(对象发送者,事件参数e)
{
MessageConfirm(“是否要更改标签?”,btnChange1\u单击);
}
受保护的无效btnChange1\u单击(对象发送者,事件参数e)
{//text属性正确更改,但updatepanel没有反映它…viewstate ajax错误?
标签1.Text=“Change1”;
}
受保护的无效btnChange2\u单击(对象发送者,事件参数e)
{
标签1.Text=“Change2”;
}
受保护的无效btnOk_单击(对象发送者,事件参数e)
{
//Label1.Text=“Change1”//这种方法有效
OkButtonClick.Invoke(发送方,e);//这不是
}
受保护的无效btnCancel\u单击(对象发送者,事件参数e)
{
}
public void MessageConfirm(字符串消息,EventHandler btnclick)
{
OK按钮单击=BTN单击;
lbMessage.Text=消息;
ModalPopupMessage.Show();
}
}
您是否尝试过调试ok按钮在btnChange\u单击调用完成时单击按钮得到的值
(new EventHandler(btnChange1_Click)).Invoke(sender, e); //this should work
最后,我改变了以下几行,解决了这个问题:
Page.GetType().InvokeMember(OkButtonClick.Method.Name, BindingFlags.InvokeMethod, null, Page, new []{sender, e}); //this works
//OkButtonClick.Invoke(sender, e); //this doesnt
但我想知道为什么它会这样工作……因此,如果有人能够解释,我会将答案授予他/她……在btnChange\u Click结束时,它分配了btnChange1\u Click,在btnOk\u Click中,当它被调用时,它也分配了btnChange1\u Click。您放置的代码可以工作,因为它直接调用btnChange1\u Click,问题是让它与传递给函数的处理程序/委托一起工作…如果我在Label1.Text中添加一个watch,我会看到它的值在btnChange1_Click中是如何变化的,但当它返回到btnOk_Click:S时,它的值会返回到原始值,理论上它们在同一个线程中,所以发生了什么?