0

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

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

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

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

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

标记如下(这只是我创建的一个示例项目,以了解基础知识):

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

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

断点

4

1 回答 1

1

我将您的更新面板和thisPhone_HookState方法导入到我制作的测试项目中,并且效果很好。我开始怀疑是否没有调用您的方法。你能尝试在你的方法中设置一个断点来测试它吗?

我想你会这样调用方法

thisPhone_HookState(_ThisPhone.HookState, new EventHandler<Maximiser.Events.Hookstate>);
于 2012-07-18T13:17:54.390 回答