Передача объектов из родительской формы в дочернюю через свойства (Winforms) - PullRequest
0 голосов
/ 21 ноября 2011

Я знаю, как передать объект из родительской формы в субформу с помощью конструкторов.

Например, в родительской форме я делаю это:

WithdrawDialog dlg = new WithdrawDialog(cust.Accounts);

Дочерняя форма:

public WithdrawDialog(BankAccountCollection accounts)
{
    InitializeComponent();
    PopulateComboBox(accounts);
}

// populate comboBox with accounts
private void PopulateComboBox(BankAccountCollection accounts)
{
    foreach (BankAccount b in accounts)
    {
        comboBoxAccount.Items.Add(b);
    }
}

Я все еще пытаюсь получить представление о свойствах ... Как бы я использовал свойства вместо перегруженных конструкторов, чтобы сделать это?

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Вот, пожалуйста,

WithdrawDialog dlg = new WithdrawDialog();
dlg.accounts = cust.Accounts;
dlg.Show();

public WithdrawDialog()
{
    InitializeComponent();
}

private BankAccountCollection m_Accounts;
public BankAccountCollection accounts {
   get {
      return m_Accounts;
   }
   set {
      m_Accounts = value;
      PopulateComboBox(m_Accounts);
   }
}

// populate comboBox with accounts
private void PopulateComboBox(BankAccountCollection accounts)
{
    foreach (BankAccount b in accounts)
    {
        comboBoxAccount.Items.Add(b);
    }
}

В качестве альтернативы PopupComboBox можно переписать для использования свойства account:

// populate comboBox with accounts
private void PopulateComboBox()
{
    foreach (BankAccount b in this.accounts)
    {
        comboBoxAccount.Items.Add(b);
    }
}
0 голосов
/ 21 ноября 2011

Хотя это можно сделать с помощью общедоступной собственности, это не рекомендуется.Для этого больше подходит метод, потому что вам нужно выполнить логику для заполнения элемента управления.

Если вы просто пытаетесь извлечь его из конструктора, сделайте PopulateComboBox общедоступным или внутренним (если родительский и дочерний элементы являютсяв той же сборке) и подумайте об изменении имени на более описательное, например «PopulateBankAccounts» или «AddBankAccounts».

Затем вы можете сделать что-то подобное в родительской форме:

using (WithdrawDialog dlg = new WithdrawDialog())
{
    dlg.AddBankAccounts(cust.Accounts)
    DialogResult result = dlg.ShowDialog();

    if (result == DialogResult.Ok)
    {
        //etc...
    }
}
0 голосов
/ 21 ноября 2011

В родительской форме:

WithdrawDialog dlg = new WithdrawDialog();
dlg.Accounts = cust.Accounts;

Дочерняя форма:

public class WithdrawDialog
{
    private BankAccountCollection _accounts;

    public WithdrawDialog()
    {
        InitializeComponent();
    }

    public BankAccountCollection Accounts
    {
        get { return _accounts; }
        set { _accounts = value; PopulateComboBox(_accounts); }
    }

    // populate comboBox with accounts
    private void PopulateComboBox(BankAccountCollection accounts)
    {
        foreach (BankAccount b in accounts)
        {
            comboBoxAccount.Items.Add(b);
        }
    }
}
0 голосов
/ 21 ноября 2011

в WithdrawDialog сделать:

public WithdrawDialog()
{
    InitializeComponent();
}

public BankAccountCollection Accounts{
    set{
        PopulateComboBox(value);
    }
}

в форме вызова сделать:

WithdrawDialog dlg = new WithdrawDialog{Accounts=cust.Accounts};

(эти фигурные скобки вызывают инициализатор объекта )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...