Два comboBox с одинаковыми членами, когда один выбран, другой не может выбрать один и тот же элемент - PullRequest
1 голос
/ 21 ноября 2011

Итак, у меня есть два комбинированных списка (comboBoxFromAccount и comboBoxToAccount).Каждый из них имеет один и тот же источник данных, который представляет собой AccountsList (список объектов BankAccount, который был передан из родительской формы).

Я хотел бы сделать так, чтобы, если элемент выбран в одном из комбинированных списков, онбольше не будет выбираться в другом.Я пытаюсь это сделать, скопировав список банковских учетных записей из comboBoxFromAccount в учетную запись comboBoxTo и удалив выбранный индекс comboBoxFromAccount из comboBoxToAccount.

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

Вот мой код:

    private BankAccountCollection accountsListTransferTo = new BankAccountCollection();

    // public property for passing collection data to the dialog
    public BankAccountCollection AccountsList
    {
        get { return accountsListTransferTo; }
        set { accountsListTransferTo = value; }
    }

    // Initial loading
    private void TransferFundsDialog_Load(object sender, EventArgs e)
    {
        textBoxAmount.Text = String.Empty;
        textBoxAmount.Select();
        comboBoxFromAccount.DataSource = AccountsList;

        accountsListTransferTo.AddRange(AccountsList); // Copy content
        accountsListTransferTo.Remove(comboBoxFromAccount.SelectedItem as BankAccount); // Remove item
        comboBoxToAccount.DataSource = accountsListTransferTo; // Data binding
    }

    private void comboBoxFromAccount_SelectedIndexChanged(object sender, EventArgs e)
    {
        accountsListTransferTo.Clear(); // Clear list, if you don't to it, AddRange will just add more items.
        accountsListTransferTo.AddRange(AccountsList); // Copy ALL accounts
        accountsListTransferTo.Remove(comboBoxFromAccount.SelectedItem as BankAccount); // Remove selected, so user cannot transfer to same account

        // Refresh data binding 
        comboBoxToAccount.DataSource = null;
        comboBoxToAccount.DataSource = accountsListTransferTo;

        // Select very first item in "TO" combobox
        comboBoxToAccount.SelectedIndex = 0;
    }

Помощь будет принята.

Ответы [ 2 ]

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

Другая возможная проблема, которую я вижу, состоит в том, что вы используете accountsListTransferTo как в качестве основной коллекции, так и той, из которой вы удаляете выбранную учетную запись. Каждый раз, когда вызывается comboBoxFromAccount_SelectedIndexChanged , еще одна учетная запись исчезает из коллекции (и, следовательно, из доступных опций в comboBoxToAccount ).

Мне кажется, я видел, как комбинированные списки ведут себя так, что событие SelectedIndexChanged (или подобное) запускается при добавлении новых элементов. Если это так, то здесь будет объяснен пустой comboBoxToAccount , потому что comboBoxFromAccount_SelectedIndexChanged будет запускаться один раз для каждого добавляемого банковского счета, по существу удаляя их из основного списка, а затем связывая сокращенный список , Вы можете легко проверить это с помощью точки останова в вашем обработчике событий.

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

Попробуйте удалить строку

comboBoxToAccount.DataSource = null;

У меня есть смутное воспоминание о том, что у комбо-боксов есть проблемы с этим.

...