我有一个主窗口表单(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
的成员填充该comboBox3)将该集合显示为列表中的项目?
答案 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