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();
}
}
}
该方法肯定正在运行,如下所示:
答案 0 :(得分:1)
我将更新面板和thisPhone_HookState
方法导入到我制作的测试项目中,并且工作正常。我开始怀疑你的方法是否未被调用。您是否可以尝试在方法中设置一个断点来测试它?
我认为你会像这样称呼这个方法
thisPhone_HookState(_ThisPhone.HookState, new EventHandler<Maximiser.Events.Hookstate>);