C # Обновление комбинированного списка привязано к общему списку - PullRequest
13 голосов
/ 11 января 2009

У меня в форме есть поле со списком, которое привязано к общему списку строк, например:

private List<string> mAllianceList = new List<string>();

private void FillAllianceList()
{
    // Add alliance name to member alliance list
    foreach (Village alliance in alliances)
    {
        mAllianceList.Add(alliance.AllianceName);
    }

    // Bind alliance combobox to alliance list
    this.cboAlliances.DataSource = mAllianceList;
}

Затем пользователь может добавлять или удалять элементы в выпадающем списке.
В другом месте я читал, что, просто добавляя или удаляя элемент в общем списке, содержимое комбинированного списка должно автоматически обновляться; то же самое должно произойти, если я использую Sort () на нем.
Но по какой-то причине я не могу заставить эту работу. Я вижу, что свойство DataSource комбинированного списка корректно обновляется при добавлении / удалении / сортировке элементов, но содержимое, отображаемое в комбинированном ящике, не соответствует свойству DataSource.

Я наверняка что-то упускаю или делаю что-то не так.
Заранее спасибо!

EDIT:
Ответ, который я выбрал, решил проблему добавления и удаления, но объект BindingList не может быть отсортирован, и это необходимо для меня. Я нашел решение, в котором пользовательский класс создается путем наследования BindingList и добавления возможностей сортировки, но я хотел бы знать, есть ли более простое решение в моем случае.
Любые предложения о том, как решить это легко?

1 Ответ

15 голосов
/ 11 января 2009

Самый простой способ обойти это - просто использовать BindingList следующим образом:

private List<string> mAllianceList = new List<string>();
private BindingList<string> bindingList;    

private void FillAllianceList()
{
    // Add alliance name to member alliance list
    foreach (Village alliance in alliances)
    {
        mAllianceList.Add(alliance.AllianceName);
    }

    bindingList = new BindingList<string>(mAllianceList);

    // Bind alliance combobox to alliance list
    this.cboAlliances.DataSource = bindingList;
}

Затем, начиная с этого момента, просто работайте со списком привязок, чтобы добавлять и удалять элементы оттуда. Это удалит его как из списка, так и из поля со списком.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш вопрос о сортировке, я думаю, самый простой (но, возможно, "хакерский" способ сделать это будет что-то вроде этого:

mAllianceList.Sort();
bindingList = new BindingList<string>(mAllianceList);
this.cboAlliances.DataSource = bindingList;

Таким образом, после сортировки вы создаете новый список привязок и сбрасываете источник данных. Может быть, есть более элегантный способ сделать это, однако это должно сработать.

...