2017-02-01 12 views
0

すべてのフォームで値を保持するクラスを渡そうとしています。しかし、私はそれを行う方法がわかりません。別のフォームにクラスを渡すには?

私のデフォルトのクラス:

namespace bankaccount 
{ 
class Account 
{ 
    private string _name, _accountNo, _accountType; 
    private double _balance = 0; 

    public string Name 
    { 
     get{ return _name;} 
     set{ _name = value;} 
    } 

    public string AccountNo 
    { 
     get { return _accountNo; } 
     set { _accountNo = value; } 
    } 

    public string AccountType 
    { 
     get { return _accountType; } 
     set { _accountType = value; } 
    } 

    public double Balance 
    { 
     get { return _balance; } 
     set { _balance = value; } 
    } 

    public Account() 
    { 
    } 

    public Account(string name, string accountNo, string accountType, double balance) 
    { 
     _name = name; 
     _accountNo = accountNo; 
     _accountType = accountType; 
     _balance = balance; 
    } 

    public double withdraw(double withdraw) 
    { 
     return _balance = _balance - withdraw; 
    } 

    public double deposit(double deposit) 
    { 
     return _balance = _balance + deposit; 
    } 
} 
} 

メインメニュー形式:

public partial class frmMainMenu : Form 
{ 
    public frmMainMenu() 
    { 
     InitializeComponent(); 
    } 

    public void btnNewAccount_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmNewAccount NewAccount = new frmNewAccount(); 
     NewAccount.Show(); 
    } 

    public void btnDeposit_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmDeposit Deposit = new frmDeposit(); 
     Deposit.Show(); 
    } 

    public void btnWithdraw_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmWithdraw Withdraw = new frmWithdraw(); 
     Withdraw.Show(); 
    } 

    public void btnBalance_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmBalance Balance = new frmBalance(); 
     Balance.Show(); 
    } 
} 

新しいアカウントフォーム(クラスからオブジェクトを作成するためのフォーム)

public partial class frmNewAccount : Form 
{ 
    public frmNewAccount() 
    { 
     InitializeComponent(); 
    } 

    private void btnRegister_Click(object sender, EventArgs e) 
    { 
     //Account newAccount = new Account(); 
     string name = string.Copy(txtName.Text); 
     string accountNo = string.Copy(txtAccountNo.Text); 
     string accountType = string.Copy(txtAccountType.Text); 
     double amount = double.Parse(txtAmount.Text); 
     Account newAccount = new Account(name, accountNo, accountType, amount); 
    } 

    private Account btnMainMenu_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmMainMenu MainMenu = new frmMainMenu(); 
     MainMenu.Show(); 
    } 
} 

預金の形

public partial class frmDeposit : Form 
{ 
    public frmDeposit() 
    { 
     InitializeComponent(); 
    } 

    private void btnDeposit_Click(object sender, EventArgs e) 
    { 

    } 

    private void btnMainMenu_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     frmMainMenu MainMenu = new frmMainMenu(); 
     MainMenu.Show(); 
    } 
} 
ここでやろうとすると、その別の形でアクセスできるように作成されたデータを使用して、新規アカウントのフォームにアカウントnewAccountを作成することです何イム

...

答えて

0

あなたは通常のクラスを渡すことはありませんが、インスタンス(すなわち、オブジェクト)。ワークフローを開始するフォームでクラスのインスタンスを作成します。呼び出されるすべての子フォームで、プロパティを追加して、子フォームを表示する前にそのプロパティの値を設定します。

using (FrmChildForm frm = new FrmChildForm()) 
{ 
    frm.Account = myBankAccount; 
    ... 
} 

別の解決策は、同様にすべての子フォームでインスタンス変数を作成し、コンストラクタでアカウントを渡すために、次のようになります。

using (FrmChildForm frm = new FrmChildForm(myBankAccount)) 
    ... 

public class FrmChildForm : Form 
{ 
    private BankAccount _account; 

    public FrmChildForm(BankAccount theAccount) 
    { 
     _account = theAccount; 
    } 
} 

あなたがやっている

あなたのナビゲーションについてそれは間違っている!あなたは何のためにもメモリをいっぱいにして、その場で何度もインスタンスを作成します。どうして?

さて、あなたのメインメニューは子フォームを作成し、次にそれを隠します。 子フォームは、それ自体を閉じて既存のメインフォームを再度表示するのではなく、新しいメインメニューを生成します。これは非常に非効率的で、私が上で話したアカウントインスタンスを維持することを妨げています。方法SubFormClosing持って、その後

public void btnNewAccount_Click(object sender, EventArgs e) 
{ 
    frmNewAccount NewAccount = new frmNewAccount(); 
    NewAccount.Account = myAccount; 
    NewAccount.FormClosing += SubFormClosing; 
    NewAccount.Show(); 
    this.Hide(); 
} 

:あなたは何をすべき

がこれです

private void SubFormClosing(object sender, FormClosingEventArgs e) 
{ 
    this.Show(); 
} 

を次に、メインフォームに戻るにはコードがまで来る:

private void btnMainMenu_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

これは1つのメインメニューを作成します。モジュールを選択すると、モジュールウィンドウが開き、メインメニューは非表示になります。モジュールウィンドウを閉じるときに新しいメインメニューを作成する代わりに、モジュールウィンドウが閉じられると古いメインメニューが復元されます。

ここでのヒントは、イベントハンドラをモジュールフォームの終了イベントにアタッチすることで、隠しメニューフォームに再度表示されるよう通知することです。

そして、モーダルダイアログについて学ぶ必要があります。新しいアカウントが作成される「ウィンドウ」は、実際には情報を収集するモーダルダイアログでなければなりません。次に、メインのmenunは、新しいアカウント情報に基づいて、そのメンバーの変数myAccountを設定します。新しいアカウントを作成するので、アカウントを「新規アカウント」マスクに渡す必要はありません。

0

このアカウントの参照を子フォームに与えるには、コードを最小限に変更する必要があります。私はそれをコンストラクターで明示的に行います。

public partial class frmDeposit : Form 
{ 
    Account _account; 
    public frmDeposit(Account account) 
    { 
    _account = account; 

    InitializeComponent(); 
    } 
(...) 

この後、frmDepositクラスの内部で_accountフィールドを使用できます。

このアプローチは通常、アカウントでフォームを初期化する際にプロパティを使用するよりも優れています。

そして、あなたが預金情報を設定するために、あなたのダイアログを作成するときに、あなたが書く代わりにする必要があります:

var depositForm = new frmDeposit(); //here you will get compilation error 
depositForm.ShowDialog() 

あなたが記述する必要があります。

var depositForm = new frmDeposit(account); //compilation error is fixed 
depositForm.ShowDialog() 
関連する問題