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

时间:2011-11-16 04:39:35

标签: c# winforms list combobox instance

我有一个主窗口表单(MainForm.cs),我在其中创建了一个Customer cust实例。

以下是所述代码的片段:

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帐户

2)使用该BankAccountCollection

的成员填充该comboBox

3)将该集合显示为列表中的项目?

3 个答案:

答案 0 :(得分:4)

您只需使用参数化构造函数并传递Collection作为参数可以为您执行任务

private void buttonDeposit_Click(object sender, EventArgs e) 
{     
   DepositDialog dlg = new DepositDialog(cust.accounts);      
   dlg.ShowDialog(); 
} 

选中此项以传递参数:C# Using New Windows Form Example

答案 1 :(得分:2)

  

1)传递数据BankAccountCollection帐户

实际上 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)使用其成员填充该comboBox   BankAccountCollection

在表单之间传递数据后,将其用于填充并不难。

foreach(BankAccount acc in accounts)
   combobox1.Items.Add(acc.ToString());
  

3)将该集合显示为列表中的项目?

您可以使用combobox1的事件处理程序对所选项目执行任何操作。

希望它有所帮助。

答案 2 :(得分:0)

你忘记了其他一些......

我的最爱 - 制作自定义'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