2017-04-10 107 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