Передача членов экземпляра из одной оконной формы в другую - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть форма главного окна (MainForm.cs), где я создал экземпляр Customer Cust.

Вот фрагмент кода:

private Customer cust;

public MainForm()
{
    InitializeComponent();
}

private void buttonDeposit_Click(object sender, EventArgs e)
{
    DepositDialog dlg = new DepositDialog();

    dlg.ShowDialog();
}

Вот коддля клиента класса.Как вы можете видеть, он создает список 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, в которой есть поле со списком.

Как бы я:

1) передать данные BankAccountCollection account

2) заполнить этот comboBox членами этой BankAccountCollection

3) отобразить эту коллекцию как элементы в списке?

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Вы просто используете конструктор параметризации и передаете коллекцию, поскольку аргумент может выполнить задачу за вас

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

Проверьте это для передачи аргумента: C # Использование нового примера формы Windows

2 голосов
/ 16 ноября 2011

1) передать данные BankAccountCollection account

На самом деле 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, чтобы делать с выбранным элементом все, что вы хотите.

Надеюсь, это поможет.

0 голосов
/ 16 ноября 2011

Вы забыли несколько других ...

Мой любимый - создайте пользовательскую функцию '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
...