如何将类传递给另一种形式?

时间:2017-02-01 08:56:38

标签: forms class parameter-passing pass-by-reference

我试图传递一个类,它保留所有表单中的值。但我不知道该怎么做。

我的默认课程:

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,使用其创建的数据以另一种形式访问...

2 个答案:

答案 0 :(得分:0)

您通常不传递类,而是传递实例(即对象)。在启动工作流的表单中创建类的实例。在所调用的每个子表单中,添加一个属性

public BankAccount Account { get; set; }

并在显示子表单之前设置该属性的值。

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;
    }
}

关于您的导航

你做错了!你无需填充内存,无处不在地创建实例。为什么呢?

好吧,您的主菜单会创建一个子表单,然后隐藏自己。您的子表单然后生成一个新的主菜单,而不是仅关闭自己并再次显示现有的主表单!这是非常低效的,并且阻止您保留我上面谈到的帐户实例。

你应该做的是:

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

然后,有一个方法SubFormClosing

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

然后,返回主窗体的代码归结为:

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

这会创建一个主菜单。选择模块后,模块窗口打开,主菜单被隐藏。关闭模块窗口时,不是创建 new 主菜单,而是在模块窗口关闭时恢复旧的主菜单。

这里的技巧是将事件处理程序附加到模块表单的结束事件,以便隐藏的菜单表单得到通知,它应该再次显示自己。

你应该学习模态对话框。创建新帐户的“窗口”实际上应该是收集信息的模式对话框。然后,主菜单根据新帐户信息设置其myAccount成员变量。无需将帐户传递到“新帐户”掩码,因为它会创建一个新帐户。

答案 1 :(得分: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()