2017-04-10 51 views
0

我有一个包含updatepanel的defualt.aspx。然后我有一个类,myTCPClient.cs,我有一个tcpclient。当它收到一条消息时,它执行一些魔术,然后通过执行updatepanel1.Update()更新updatepanel。但是,我如何访问updatepanel?从另一个类更新更新面板

我唯一的解决办法是将updatepanel传递给类。但是,这是做到这一点的方式吗?一定会有更好的办法?

+0

你想在后台做些什么,然后发送消息到UpdatePanel(坐在某人的浏览器的页面上)来刷新?因为那不会那样明确地工作。 UpdatePanel更新(或不)对浏览器的请求和响应。我怀疑你想要做的是设置一个Timer来轮询更新,并将Timer设置为UpdatePanel上的AsyncPostbackTrigger。 –

+0

在后台运行tcpclient。当客户端收到消息时,我希望它更新时间。所以它只会在有新消息时更新,而不是每隔一秒左右。 –

+0

这实际上并不是网页的工作原理。您不能将数据从后端推送到客户端的浏览器。网页浏览器必须发送请求。 –

回答

0

您将需要使用计时器轮询更改。您可以使用这样的:因为它接收数据

protected void Timer1_Tick(object sender, EventArgs e) 
    { 
     string s = (string)Session["Text"]; 
     Session["Text"] = String.Empty; 

     bool hasNewText = !String.IsNullOrEmpty(s); 

     if (hasNewText) 
     { 
      txtOut.Text += s; 
      UpdatePanel1.Update(); 
     } 
    } 

你的后台进程将追加文本会话[“文本”。您可以禁用定时器,并在启动后台进程时启用它。

你的UpdatePanel可能是这个样子:

<asp:UpdatePanel runat="server" ID="UpdatePanel1" UpdateMode="Conditional" ChildrenAsTriggers="False"> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnOK" /> 
     </Triggers> 
     <ContentTemplate> 
      <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick" /> 
      <asp:TextBox ID="txtOut" ReadOnly="true" runat="server" Width="600px" Height="299px" Font-Names="Courier New" 
         TextMode="MultiLine"></asp:TextBox> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

ChildrenAsTriggers="False"是很重要的,因为它告诉你的UpdatePanel不是每次更新计时器回发,但只有当你调用UpdatePanel1.Update()。

+0

谢谢。这解决了我的问题,并做我需要的。我只是希望你能访问它。 –

+0

如果你有时间,看看SignalR - http://signalr.net/ – sh1rts