Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实例的成员从一个windows窗体传递到另一个窗体_C#_Winforms_List_Combobox_Instance - Fatal编程技术网

C# 将实例的成员从一个windows窗体传递到另一个窗体

C# 将实例的成员从一个windows窗体传递到另一个窗体,c#,winforms,list,combobox,instance,C#,Winforms,List,Combobox,Instance,我有一个主windows窗体(MainForm.cs),我在其中创建了Customer cust的一个实例 下面是上述代码的一个片段: private Customer cust; public MainForm() { InitializeComponent(); } private void buttonDeposit_Click(object sender, EventArgs e) { DepositDialog dlg = new DepositDialog();

我有一个主windows窗体(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类的代码。如您所见,它创建了一个银行帐户列表:

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的表单,其中有一个组合框

我将如何:

1) 传递数据BankAccountCollection帐户

2) 用BankAccountCollection的成员填充该组合框


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

您只需使用参数化构造函数,并将集合传递为参数即可完成任务

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

检查此项以传递参数:

您只需使用参数化构造函数并传递集合,因为参数可以为您完成任务

private void buttonDeposit_Click(object sender, EventArgs e) 
{     
   DepositDialog dlg = new DepositDialog(cust.accounts);      
   dlg.ShowDialog(); 
} 
检查此项以传递参数:

1) 传递数据BankAccountCollection帐户

实际上有5种方法来传递数据

1-(如果参数太多,则不推荐)通过构造函数传递数据

 private void ShowForm(int a, string b, double c)
{
    Form2 frm = new Form2(a, b, c);
    frm.ShowDialog();
}
2-使用目标类的公共字段。(完全不推荐)

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-使用代表。(这个有点棘手)

我个人最喜欢的是属性、委托,在某些罕见的情况下还有构造函数

或者,您可以创建一个静态类,在其中放入一些属性,然后以其他形式使用它。 如果您的所有表单都需要共享一些信息,这将非常有用。因为这不是在表单之间传递数据的方法,所以我在上面的方法中没有提到这个方法

2) 用该组合框的成员填充该组合框 银行账户托收

一旦在表单之间传递了数据,使用它进行填充并不困难

foreach(BankAccount acc in accounts)
   combobox1.Items.Add(acc.ToString());
3) 是否将该集合显示为列表中的项目

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

希望能有帮助

1) 传递数据BankAccountCollection帐户

实际上有5种方法来传递数据

1-(如果参数太多,则不推荐)通过构造函数传递数据

 private void ShowForm(int a, string b, double c)
{
    Form2 frm = new Form2(a, b, c);
    frm.ShowDialog();
}
2-使用目标类的公共字段。(完全不推荐)

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-使用代表。(这个有点棘手)

我个人最喜欢的是属性、委托,在某些罕见的情况下还有构造函数

或者,您可以创建一个静态类,在其中放入一些属性,然后以其他形式使用它。 如果您的所有表单都需要共享一些信息,这将非常有用。因为这不是在表单之间传递数据的方法,所以我在上面的方法中没有提到这个方法

2) 用该组合框的成员填充该组合框 银行账户托收

一旦在表单之间传递了数据,使用它进行填充并不困难

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

你忘了其他几个

我的最爱-创建一个自定义的“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

如果您已经有了数据,并且希望在启动对话框时只填充数据,那么按照pranay所说的去做。如果在动态上,即在某些事件上,则使用事件和委派。我认为您的
客户
构造函数中可能存在问题。您有
帐户
作为私人成员和参数。您必须知道您正在将新对象添加到参数而不是私有成员。请不要在标题前加上“C”。这就是我们在上使用标签的原因。谢谢Mun Pieng。我把它改成了一个无参数的构造函数。如果你已经有了数据,并且你想在你启动一个对话框时填充它,那么就按照pranay说的去做。如果在动态上,即在某些事件上,则使用事件和委派。我认为您的
客户
构造函数中可能存在问题。您有
帐户
作为私人成员和参数。您必须知道您正在将新对象添加到参数而不是私有成员。请不要在标题前加上“C”。这就是我们在上使用标签的原因。谢谢Mun Pieng。我已将其更改为无参数构造函数。如何重载构造函数以使其接受集合?什么是代码签名?@iggy2012:与您现有的
客户
签名相同-只是参数不同,名称与您正在为其创建构造函数的类相同…类似于
DepositDialog(BankAccountCollection collection)
我如何重载构造函数以使其接受一个collection