2017-05-30 58 views
0

我有三種形式,f1,f2,f3我們會稱它們。我有一個類Account,其中我存儲usernamepassword,groupspath(文件)。 F2是主要的形式,並應與其他兩種形式進行交互。 F1是登錄表單,F3是編輯表單。我在我的program.cs中使用它來在其他表單之前調用登錄表單。傳遞數據w /構造函數與主窗體

Form1 login = new Form1(); 
if (login.ShowDialog() == DialogResult.OK) 
{ 
    Application.Run(new Form2()); 
} 

f2f3之間傳遞數據,我使用構造與賬戶類。但是,我也想將數據從f1傳遞到f2,但是如果我使用相同的方法,則表單之間不會有數據交互(數據爲空)。

我編輯上面的代碼這樣:

Form1 login = new Form1(); 
Account acc = new Account(); 
if (login.ShowDialog() == DialogResult.OK) 
{ 
    Application.Run(new Form2(acc)); 
} 

在登錄表單(f1),我通過一些數據到Account類,所以在登錄按鈕點擊發生這種情況:

private void LoginButton_Click(object sender, EventArgs e) 
{ 
    Account acc = new Account(); 
    //some code 
    acc.Groups = "New group"; 
    //some more code 
    DialogResult = DialogResult.OK; 
} 

然後,在Form2.cs,我有以下代碼:

string groups = ""; 
public Form2(Account acc) 
{ 
    InitializeComponent(); 
    groups = acc.Groups; 
} 

但每當我這樣運行時,我從來沒有在主窗體中得到任何結果(f2),acc.Groups始終爲空,我不知道爲什麼。我使用了與構造函數相同的方法將數據從f2提取到f3,並且它工作正常,爲什麼這不起作用?是否因爲我在登錄表單中使用了錯誤的方法?處理這個問題的正確方法是什麼?

+1

如果你的'Account'類是不依賴於任何具體的類,那麼你可以讓你的'Account'類屬性的靜態和徘徊無論你想('Account.Groups =訪問它們「新組」;') – jAC

+0

Click處理程序中引用的'Account'和登錄表單中聲明的​​'Account'是2個不同的對象。 –

+0

我想避免聲明任何靜態或公共。@ BarryO'Kane我足夠新,現在知道如何正確連接一切。 – EInherjar

回答

1

問題是您在LoginButton_Click事件中創建了Account的新實例。你永遠不會將這個實例傳遞給form2!

Form1Account類型創建一個域:

Account my_account; 

和過載的構造採取的帳戶作爲參數:

public Form1(Account acc) 
{ 
    my_account = acc; 
} 

然後在單擊事件引用場my_account

private void LoginButton_Click(object sender, EventArgs e) 
{ 
    //reference the class variable 
    my_account.Groups = "New group"; 
    //some more code 
    DialogResult = DialogResult.OK; 
} 

在開始你需要的Account啓動實例傳遞到Form1構造,因此可以填入值:

當創建的Account acc = new Account();一個實例你得到一個唯一的對象有:

Account acc = new Account(); 
Form1 login = new Form1(acc); 

if (login.ShowDialog() == DialogResult.OK) 
{ 
    Application.Run(new Form2(acc)); 
} 

詳細說明內存中的特定位置。當您將此對象傳遞給Form1的構造函數並將其分配給私有字段my_account時,實際上只傳遞acc的引用。意思是你將它的位置傳遞給內存。這意味着當您在構造函數中這樣做時:my_account = acc;確保my_account指向與acc對象相同的位置。當您通過將字符串分配給Groups來操縱my_account的值時,您實際上會操縱原始acc對象。從Form1返回後,再次傳遞acc對象作爲下一個構造函數的引用。因此,當您訪問Form2此對象的groups = acc.Groups;時,您將訪問您已經操作的內存中的原始位置,並且您已將該位置分配給字符串"New group"

在您的發佈代碼中,您在Form1中使用Account acc = new Account();創建了一個新對象,該對象又是唯一的,並且與您在開始時創建的對象無關。該對象也位於與第一個acc對象不同的內存部分上。這就是爲什麼物業Groupsnull當您嘗試訪問它Form2 我希望這是understanable

+0

這很好,謝謝,但你會提供更多的細節,以瞭解它是如何工作的。 – EInherjar

+0

@EInherjar我編輯了我的帖子,並寫了一個詳細的解釋。看一看。希望這是可以理解的。如果不只是給我留言 –

0

我看到你在兩個地方(讓你有多個實例)創建新帳戶(),但你不要通過賬戶來形式2。

您可以使帳戶靜態像Janes建議在評論或使財產獲得帳戶。

0

在Form1,聲明

public Account Account { get; set; } 

帳號,聲明

public Form1 Form1{ get; set; } 

之後創建的2個對象登錄和ACC:

Form1 login = new Form1(); 
Account acc = new Account(); 

分配彼此

login.Account = acc; 
acc.Form1 = login;