ASP.Net - 在引发事件时更新Update Panel中的控件

时间:2012-07-18 13:04:23

标签: c# asp.net ajax multithreading

ASP.Net noob在这里尝试更新订阅事件的方法内的UpdatePanel内的控件,但没有运气。

有些背景,我编写了一个与标准POTS电话接口的DLL,我已经将电话端的各种事件(电话被拿起,电话响铃等)映射到.Net事件。

在我的ASP.Net解决方案中,我添加了我的DLL,实例化了我的手机,在订阅我的事件的方法中,我想更新UpdatePanel中的各种标签,并将EventArgs对象内的信息传递给我的方法。

使用断点,我可以看到我的Phone对象按预期运行,事件正在被引发,并且EventArgs包含它们应该的信息。

但UpdatePanel内的标签永远不会更新。我将应用程序的先前版本作为Windows窗体编写,我记得每当从另一个线程更新UI时,我必须首先检查InvokeRequired是否为真,如果是,则调用Invoke方法但是我不知道ASP.Net中的等价物是什么(如果有的话)。

Markup在下面(这只是我为了解决基础知识而创建的一个示例项目):

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication2.WebForm1" %>

<!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></title>
    <style type="text/css">
        #form1
        {
            text-align: center;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" style="text-align: center" Text="Label"></asp:Label>
            <br />
            <br />
            <asp:Button ID="Button1" runat="server" Text="Button" />

        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ScriptManager1" EventName="Load" />
        </Triggers>
    </asp:UpdatePanel>
    </form>
</body>
</html>

现在代码:

using System;

//My DLL
using Maximiser;

namespace WebApplication2
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        //My Phone Object
        private Phone _ThisPhone { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            //Instantiating Phone Object with IP Address and Port
            _ThisPhone = new Phone("8.8.8.8", 8888);

            //Hookstate event indicates phone is off/on the hook
            _ThisPhone.HookState += new EventHandler<Maximiser.Events.Hookstate>(thisPhone_HookState);
        }

        void thisPhone_HookState(object sender, Maximiser.Events.Hookstate e)
        {
            //I want to update my Label with the phones current HookState
            Label1.Text = e.State;

            //Now I want to refresh the UpdatePanel but not reload the page
            UpdatePanel1.Update();
        }
    }
}

该方法肯定正在运行,如下所示:

Breakpoint

1 个答案:

答案 0 :(得分:1)

我将更新面板和thisPhone_HookState方法导入到我制作的测试项目中,并且工作正常。我开始怀疑你的方法是否未被调用。您是否可以尝试在方法中设置一个断点来测试它?

我认为你会像这样称呼这个方法

thisPhone_HookState(_ThisPhone.HookState, new EventHandler<Maximiser.Events.Hookstate>);