将实例的成员从一个窗口窗体传递到另一个窗体

本文关键字:窗体 窗口 一个 另一个 实例 成员 | 更新日期: 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 accounts

2)用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