我试图传递一个类,它保留所有表单中的值。但我不知道该怎么做。
我的默认课程:
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 :(得分: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()