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();
}
}
}
该方法肯定正在运行,如下所示: