【问题标题】:how to pass class to another form?如何将课程传递给另一种形式?
【发布时间】:2017-06-17 22:48:48
【问题描述】:

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

我的默认班级:

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

New Account 表单(从类中创建对象的表单)

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,使用它创建的数据可以在另一个表单中访问...

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这里的技巧是在模块表单的关闭事件上附加一个事件处理程序,这样隐藏的菜单表单就会得到通知,它应该再次显示自己。

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

    【讨论】:

      【解决方案2】:

      您的代码必须进行最低限度的更改,以便将此帐户引用提供给子表单。我会在构造函数中明确地这样做。

      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()
      

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多