2011-11-16 99 views
0

我有一個主窗口窗體(MainForm.cs),我創建了一個Customer cust實例。將實例的成員從一個窗體傳遞到另一個窗體

這裏是一個片段說代碼:

private Customer cust; 

public MainForm() 
{ 
    InitializeComponent(); 
} 

private void buttonDeposit_Click(object sender, EventArgs e) 
{ 
    DepositDialog dlg = new DepositDialog(); 

    dlg.ShowDialog(); 
} 

下面是客戶類的代碼。正如你所看到的,它創建BankAccounts的列表:

class Customer 
{ 
    private BankAccountCollection accounts; 

    public Customer(BankAccountCollection accounts, TransactionCollection transactionHistory) 
    { 
     accounts.Add(new SavingsAccount(true,200)); 
     accounts.Add(new SavingsAccount(true, 1000)); 
     accounts.Add(new LineOfCreditAccount(true, 0)); 
    } 

    public BankAccountCollection Accounts 
    { get { return accounts; }} 
} 

現在,我有另一種形式叫做DepositDialog,這裏面出現一個組合框。

我怎麼會:

1)通過數據BankAccountCollection佔

2)填充與BankAccountCollection

3)的成員,組合框顯示該集合作爲列表中的項目?

+0

如果您已經有數據,並且希望在啓動對話框時填充它,請按照pranay的說法操作。如果在動態的情況下,即在某些事件上使用Events和Delegates – Zenwalker

+0

我認爲你的'Customer'構造函數可能有問題。你有'帳戶'作爲私人成員,也作爲參數。您必須知道您將新對象添加到參數而不是私有成員。 –

+0

請勿在「C#」前添加標題。這就是我們在[so]上使用標籤的原因。 –

回答

2

1)通過數據BankAccountCollection賬戶

實際上有5種方式到pa數據。

1-(如果參數太多,不推薦)通過構造函數傳遞數據。

private void ShowForm(int a, string b, double c) 
{ 
    Form2 frm = new Form2(a, b, c); 
    frm.ShowDialog(); 
} 

2-使用目標類的公共字段。 (建議不要在ALL)

private void ShowForm(int a, string b, double c) 
{ 
    Form2 frm = new Form2(); 
    frm.intval = a; 
    frm.strval = b; 
    frm.doubleval = c; 
    frm.ShowDialog(); 
} 

3-使用屬性。

private void ShowForm(int a, string b, double c) 
{ 
    Form2 frm = new Form2(); 
    frm.IntValue = a; 
    frm.StringValue = b; 
    frm.DoubleValue = c; 
    frm.ShowDialog(); 
} 

4-使用標籤。

private void ShowForm(int a, string b, double c) 
{ 
     Form2 frm = new Form2(); 
     frm.SomeTextBox.Tag = a; 
     frm.SomeTextBox2.Tag = b; 
     frm.SomeTextBox3.Tag = c; 
     frm.ShowDialog(); 
} 

5-使用代表。 (這個有點棘手)。

//in Form2 
public delegate void PassValues(int a, string b, double c); 
public PassValues passVals; 

private void PassDataThroughDelegate(int a, string b, double c) 
{ 
    if(passVals != null) 
     passVals(a,b,c); 
} 

//in Form1 
private void ShowForm(int a, string b, double c) 
{ 
    Form2 frm = new Form2(); 
    frm.passVals = new Form2.PassValues(UseData); 
    frm.ShowDialog(); 
} 

private void UseData(int a, string b, double c) 
{ 
} 

我個人最喜歡的是屬性,委託和一些罕見的構造函數。

或者,您可以創建一個靜態類,在其中放入一些屬性,然後以其他形式使用它。 如果您的所有表單都需要共享某些信息,那麼這非常有用。由於這不是一種在表單之間傳遞數據的方式,所以我在上面沒有提到這種方法。

2)填充該組合框用的是 BankAccountCollection

成員一旦形式之間傳遞的數據,使用它的人口並不難。

foreach(BankAccount acc in accounts) 
    combobox1.Items.Add(acc.ToString()); 

3)顯示該集合作爲列表中的項目?

您可以使用combobox1的事件處理程序來執行您想要的所選項目。

希望它有幫助。

+0

這太棒了。非常感謝你做的這些。 – iggy2012

4

你只要利用參數化構造的ANS通過集合作爲參數,可以爲你做任務

private void buttonDeposit_Click(object sender, EventArgs e) 
{  
    DepositDialog dlg = new DepositDialog(cust.accounts);  
    dlg.ShowDialog(); 
} 

檢查這個傳遞參數:C# Using New Windows Form Example

+0

我將如何重載構造函數,以便它需要一個集合?代碼簽名是什麼? – iggy2012

+0

@ iggy2012:與您現有的'客戶'簽名相同 - 只是參數不同,並且與您創建構造函數的類名稱相同... –

+0

「DepositDialog(BankAccountCollection集合)」 – V4Vendetta

0

你忘記一些其他的...

我最喜歡的 - 做一個自定義的「初始化()」函數來設置數據,然後打開正常使用的ShowDialog()的形式。然後你可以有很多形式實現這個接口,並動態地顯示它們。

private Customer Customer { get ; set; } 
public void Initialize(Customer cust) { 
    this.Customer = cust; 
} 


var f = new CustomerForm(); 
f.Initialize(_myCustomer); 
f.ShowDialog(); 

您可以覆蓋的ShowDialog()函數,但讓你有三個覆蓋,現在,這可能會或可能不會被接受。如果需要,也可以覆蓋owner屬性。

public void ShowDialog(Customer cust) { 
    this.Customer = cust; 
    base.ShowDialog(); 
} 

您可以隱藏舊的ShowDialog()以防止人們調用它。這可以通過簡單地將該類型轉換爲Form來逃脫,所以它不是一個真正的解決方案。

new public void ShowDialog() { 
    throw new Exception("arg!"); 
} 

(new CustomerForm()).ShowDialog(); // exception! 
(new CustomerForm() as Form).ShowDialog() // works fine 
相關問題