2017-04-04 41 views
0

我知道標題問題並非唯一且大量的消息可用。我打開一個主題的原因是,我真的很難根據我的項目來了解這個問題。在表單/類別之間共享信息

最近我試圖啓動一個WinForm從一個REST API獲取值。

正如在Form1上開始測試一旦點擊metroButton1我應該得到一個SessionToken到metroTextBox1.Text,其中工程。

當我掙扎是使用輸出作爲getvirtualmachine類的輸入。

一旦在課堂上使用Form1.connect()來獲得SessionToken,我'得到以下錯誤:

An object reference is required for the non-static field, method, or property 'Form1.connect()'

不知道我怎麼能有這樣的在全球範圍內使用它作爲輸入了幾類。猜測我在某處/某個地方犯了一個大錯。

FORM1

public partial class Form1 : MetroFramework.Forms.MetroForm 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { } 

    public string connect() 
    { 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:35113/api/sessions/start"); 
     httpWebRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(metroTextBox3.Text + ":" + metroTextBox4.Text)); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "POST"; 

     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = JsonConvert.SerializeObject(new 
      { 
       ServerPort = "35107", 
       Username = metroTextBox3.Text, 
       Password = metroTextBox4.Text, 
       Domain = metroTextBox5.Text 
      }); 

      streamWriter.Write(json); 
     } 

     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
      dynamic item = Newtonsoft.Json.JsonConvert.DeserializeObject(result); 
      return (string)item.Data; 
     } 
    } 

    public void metroButton1_Click(object sender, EventArgs e) 
    { 
     metroTextBox1.Text = connect(); 
    } 

GetVirtualMachines類

public class GetVirtualMachines 
{ 
    public string gVM() 
    { 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:35113/api/vms/list/"); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "GET"; 

     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = JsonConvert.SerializeObject(new 
      { 
       SessionToken = Form1.connect(), 
      }); 

      streamWriter.Write(json); 
     } 

     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
      dynamic item = Newtonsoft.Json.JsonConvert.DeserializeObject(result); 
      return item; 
     } 
    } 
} 
+0

Ups。似乎我的問候沒有添加到帖子。 「你好專家」算賬;) – Max

回答

0

要麼你需要做的的方法靜態的,所以它的類定義的一部分,而不是一個實例方法,即

public static string connect() 

或創建Form1的實例並使用該實例調用connect()。然而,最終建立另外一個問題,因爲現在你已經有了一個形式,沒有人見過(並防止關閉應用程序)內存掛出來,所以你真的應該確保它得到處理,即

using(var form = new Form1) 
{ 
    form.connect(); 
} 

但是,我更大的問題是,爲什麼您使用表單來執行此操作。在我看來,更像connect()方法屬於GetVirtualMachines類。

目前,鑑於還有你的代碼,這是非常糟糕的使用工具集。

0

你需要重新考慮你的方法。 Windows窗體(Form1)是用戶看到的實際GUI。您的後端GetVMs類似乎純粹用於數據處理,而用戶並未真正與之交互。

因此,您無法真正讓GetVMs類創建Windows窗體的新實例,因爲用戶無法看到新建的窗體(這裏簡化了很多!)。 - 這是用戶看到的

  • 形式有你GetVMs的實例

    1. 您的Windows窗體的觀點:

      我會按照一個相對標準的視圖/控制器類型的模式解決了這個類private GetVirtualMachines VMGetter

    2. 的形式通過其類(VMGetter)的實例調用的方法GetVirtualMachines,通過與無論是在文本框中的參數。

    在我給出的簡化方法中,這仍然不是最好的想法,因爲您將掛起UI線程。但是,希望它給你一個跳躍點。

    編輯:我也想移動連接方法和業務邏輯的GetVMs類。通常我們嘗試在所有視圖/顯示類中避免業務邏輯。

  • +0

    THX爲快回信。爲什麼我剛開始使用表單中的connect()是因爲我能夠在Buttonclick void中使用它。一旦我將connect()移動到另一個類,我有問題要到達Metrotextboxes。然後獲取相同的對象參考錯誤。一旦將connect()移動到類中,我將如何從metroboxes獲取數據。將在早上嘗試。 ;) – Max

    +0

    我看到線程被標記爲「重複」。我沒有第二表格。 我只有1 Form和1 Class。我將connect()移到了Class中。 所以我試圖達到現在從窗體類。並從類到文本框。兩個都失敗了。我查看了Forms Thread>之間的共享,但對我來說並不是很有幫助,因爲代碼是不同的。我不明白爲什麼要面對這些問題。 )。任何進一步的幫助appriciated。一旦我瞭解情況 - 我肯定能夠進一步工作。 – Max