【问题标题】:UpdatePanel doesnt reflect changes if the function is called by delegates如果函数被委托调用,UpdatePanel 不会反映更改
【发布时间】:2012-05-15 11:24:36
【问题描述】:

具有以下设置,如果您通过委托/事件处理程序更改更新面板,为什么更新面板不反映标签文本更改?你会如何让它发挥作用?

Test.aspx:

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

【问题讨论】:

  • 如果我将手表添加到 Label1.Text 我会看到它的值在 btnChange1_Click 内部如何变化,但是当它返回到 btnOk_Click :S 时它的值会返回到原始值,理论上它们在同一个线程中,所以发生了什么事?

标签: c# asp.net updatepanel ajaxcontroltoolkit modalpopupextender


【解决方案1】:

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

Page.GetType().InvokeMember(OkButtonClick.Method.Name, BindingFlags.InvokeMethod, null, Page, new []{sender, e}); //this works
//OkButtonClick.Invoke(sender, e); //this doesnt

但我想知道为什么它会以这种方式工作......所以如果有人能解释它,我将给予他/她的答案......

【讨论】:

    【解决方案2】:

    btnChange_Click 调用完成时,您是否尝试调试OkButtonClick 获得的值..

    (new EventHandler(btnChange1_Click)).Invoke(sender, e); //this should work
    

    【讨论】:

    • 在 btnChange_Click 结束时它已经分配了 btnChange1_Click 并且在 btnOk_Click 被调用时它也分配了 btnChange1_Click。
    • 您放置的代码有效,因为它直接调用 btnChange1_Click,事情是让它与传递给函数的处理程序/委托一起工作......
    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多