2016-10-17 28 views
0

嘗試#2。無法更新子類的主窗體控件

我試圖在兩個類中調用函數。一種獲得B類數據和調用函數B以通過Windows Form應用程序顯示數據的函數。

//Class B containing function B 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace GUI_Server 
{ 
    public partial class ChatServer : Form 
    { 

     private delegate void EnableDelegate(bool enable); 
     private static ChatServer CHT = new ChatServer(); 

     public ChatServer() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      ServerBackBone.test(); 
     } 

     public static void TestConnectivity(string text) 
     { 
      CHT.TestLabel.Text = text; 
     } 
    } 
} // Assume Class B 

及以下爲A級和功能

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 


namespace GUI_Server 
{ 
    class ServerBackBone 
    { 


     private static ChatServer CHT = new ChatServer(); 
     public static void test() 
     { 
      ChatServer.TestConnectivity("test"); 


     } 


    } 
} 

那麼,究竟是怎麼回事是窗體被加載,調用A類中的靜態函數聯繫B類>函數B更新主窗口上的標籤...問題在於用新文本更新標籤。

單步執行代碼顯示所有函數都被成功調用&期望的文本被傳遞給函數。

雖然,按F5時開始調試所述應用,診斷工具顯示以下信息:

的診斷工具意外

診斷轂輸出顯示失敗

響應狀態碼不表示成功:401(未授權)。

通用輸出顯示:

線程0x20c0已經退出,代碼0(爲0x0)。

線程0x1624已退出,代碼爲0(0x0)。

'GUI Server.vshost.exe'(CLR v4.0.30319:GUI Server.vshost.exe): 加載「C:\用戶\神泣\文件\的Visual Studio 2015年\項目\ GUI 服務器\ GUI服務器\ bin \ Debug \ GUI Server.exe「。符號加載。

線程0x20fc已退出代碼0(0x0)。

線程0xae8已退出,代碼爲0(0x0)。

應用程序在這些消息顯示後成功運行。逐步顯示錯誤,也不會出現斷點。標籤未在主控制中更新

全新的項目。只有實際表單界面上的元素是屬性重命名爲TestLabel的標籤。

this.TestLabel = new System.Windows.Forms.Label(); 
      this.SuspendLayout(); 
      // 
      // TestLabel 
      // 
      this.TestLabel.AutoSize = true; 
      this.TestLabel.Location = new System.Drawing.Point(43, 70); 
      this.TestLabel.Name = "TestLabel"; 
      this.TestLabel.Size = new System.Drawing.Size(35, 13); 
      this.TestLabel.TabIndex = 0; 
      this.TestLabel.Text = "label1"; 

回答

1

我不知道該thisForm1_LoadCHTTestConnectivity是同一個對象。他們必須是,因爲它是this您正在嘗試更新。

+0

也許是這樣。該塊和不得不使用這種方法是,我在主應用程序中使用靜態類功能,當它正在備份和運行。解決辦法保持靜態? –

+0

將您的'public static void Test()'更改爲'public static string Test()',它將返回要在窗體上使用的值。如果它是異步的,你可以'等待'或者使用事件監聽器 – Jonathan

+0

這將毫無疑問地解決當前問題,這個問題值得我們思考的是我最終將使用套接字來發送/接收數據,這兩個整數和字符串。用Sockets看到的例子,它使用了一個回調函數,並且什麼都沒有返回,並且可以在任何時候被調用,人們將如何去監聽一個事件,該事件使用一個單獨的函數作爲正在運行的回調在後臺?當數據被接收時,哪一個也會更新主窗體? –