2017-04-13 100 views
-1

我目前有兩種形式; Form1和Form2。 Form1用於我的clickergame,在那裏我有一個叫「錢」的雙。 我需要從Form2訪問此值。我已經設置了雙「錢」公開,我已經調用Form1中:VS C#從一個表單獲取數據到另一個表單

Form1 mainform = new WindowsFormsApplication3.Form1(); 

即使我這樣做,我沒有收到值,當我做mainform.money 什麼我可不可以做錯了嗎?

+0

但你實例化Form1上,而不是窗體2 –

+0

我在很新這個,你在乎解釋嗎? –

+0

https://stackoverflow.com/questions/1665533/communicate-between-two-windows-forms-in-c-sharp –

回答

-1

,我建議你在兩種形式寫的可變貨幣:

// Form1 
private Form2 frm2 = new Form2(); 
public double money = 0; 

private void changeMoney() 
{ 
    frm2.money = /* value */; 
    this.money = /* value */; 
} 
// Use this method to change money from form1 


// Form2 
private Form1 frm1 = new Form1(); 
public double money = 0; 

private void changeMoney() 
{ 
    frm1.money = /* value */; 
    this.money = /* value */; 
} 
// Use this method to change money from form1 

另一種選擇是創建一個靜態類是這樣的:

public static class values 
{ 
    public static double money = 0; 
} 

// From the form1 or form2, you can change the money like this: 
values.money = /* value */; // set money 
var x = values.money; // get money 

我希望這個答案幫助你, Gerry

+0

像你的第一個例子重複代碼通常是不好的,應該避免。 – dotTutorials

+0

第二個選項很好,謝謝! –

+0

遞歸創建這樣的實例是一個壞主意......至於靜態字段,它們本質上是全局狀態。這經常導致代碼由於具有太多(不可見)依賴性而難以維護。更好的解決方案是明確傳遞依賴關係:如果'Form2'需要顯示一些數據,則通過其構造函數傳遞該數據。在這種情況下,您可以將它傳遞給Form1引用,但最好將UI與實際的數據和邏輯分開,所以兩種形式都可以使用的GameState類仍然更好。 –

0

將變量從一種形式暴露給世界其他地方並不是一個好習慣。您應該將變量封裝/隱藏在只讀訪問或方法的屬性中,傳遞值作爲構造函數參數等。 示例下面的示例使用注入構造函數進行只讀屬性訪問。

方法一使用構造器注入

// Form1 
private double _money = 0; 
_money = 100; 
Form2 frm2 = new Form2(money); 

//Form2 
private double _money = 0; 
public Form2(double money) 
{ 
    _money = money; 
} 

方法2使用只讀的getter訪問

// Form1 
public double Money {get;private set;} 

//Form2 
Form1 frm1 = new Form1(); 
private double _money = 0; 
_money = frm1.Money;