将实例的成员从一个窗口窗体传递到另一个窗体
本文关键字:窗体 窗口 一个 另一个 实例 成员 | 更新日期: 2023-09-27 18:14:52
我有一个主窗口窗体(MainForm.cs),我在其中创建了一个实例Customer。
下面是上述代码的一个片段:
private Customer cust;
public MainForm()
{
InitializeComponent();
}
private void buttonDeposit_Click(object sender, EventArgs e)
{
DepositDialog dlg = new DepositDialog();
dlg.ShowDialog();
}
下面是Customer类的代码。如您所见,它创建了一个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的表单,其中有一个comboBox。
如何:
1)传递数据BankAccountCollection accounts2)用BankAccountCollection的成员填充comboBox
3)将集合显示为列表中的项?
您只需使用参数化构造函数并将Collection作为参数传递即可为您完成任务
private void buttonDeposit_Click(object sender, EventArgs e)
{
DepositDialog dlg = new DepositDialog(cust.accounts);
dlg.ShowDialog();
}
c#使用新的Windows窗体示例
1)传递数据BankAccountCollection accounts
实际上有5种方法传递数据。
1-(如果参数太多不推荐)通过构造函数传递数据。
private void ShowForm(int a, string b, double c)
{
Form2 frm = new Form2(a, b, c);
frm.ShowDialog();
}
2-使用目标类的公共字段。(完全不推荐)
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的事件处理程序对所选项目做任何您想做的事情。
希望能有所帮助。
你忘了其他几个…
我的最爱-创建一个自定义的'Initialize()'函数来设置数据,然后使用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