C# 将实例的成员从一个windows窗体传递到另一个窗体
我有一个主windows窗体(MainForm.cs),我在其中创建了Customer cust的一个实例 下面是上述代码的一个片段: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();
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