Как остановить привязку Souce / ComboBox от изменения выделения - PullRequest
2 голосов
/ 19 августа 2010

У меня есть простая форма со списком в качестве источника данных, источник привязки, привязанный к списку, и поле со списком, привязанное к источнику привязки, при этом некоторые поля редактируются независимо от значения bindingSource.Current. То, что я хотел бы сделать, это если bool установлен, всплывающее диалоговое окно с вопросом, хотят ли они сохранить изменения, прежде чем они изменят элементы. Если они говорят «нет», я хочу позвонить CancelEdit(), если «да», я хочу оставить их на текущем элементе, чтобы они могли нажать кнопку «Сохранить». Как мне это сделать?

Вторая часть моего вопроса состоит в том, что мой подчеркивающий источник данных - List<View> будет CancelEdit() даже что-нибудь делать? (Представление - это просто класс с string Name и List<CustomColumn>

Edit: Позвольте мне подробно рассказать о том, что я делаю, чтобы, возможно, помочь объяснить, что я делаю. У меня есть список View, они в других местах программы будут перечислены для генерации DataGridView. Для этого меню добавляются новые «Представления» и изменяется порядок столбцов в представлении (фактически он никогда не редактирует CustomColumn, просто добавляя элементы и изменяя порядок list<CustomColumn>). Я хочу, чтобы кто-то нажал кнопку «Отмена» или изменил новое представление с помощью поля со списком, не сохраняя его, и все изменения, внесенные в List<CustomColumn>

, будут отменены.

1 Ответ

1 голос
/ 23 августа 2010

Если я правильно выведу ваш вопрос, то ответ не тот, который вам понравится;ComboBox не имеет механизма отмены изменения выбора.Я хотел бы, чтобы это произошло, поскольку я сталкивался с этим вопросом снова и снова.Вот как я бы обошел ограничение:

bool ignoreEvent = false;
object lastSelectedItem = null;

void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
    if (ignoreEvent) return;

    if (CheckForChanges()) {
        if (MessageBox.Show("Do you want to save changes?", "Save changes", MessageBoxButtons.YesNo) == DialogResult.Yes) {
            ignoreEvent = true;
            comboBox1.SelectedItem = lastSelectedItem;
            ignoreEvent = false;
        }
        else {
            // call CancelEdit() here
        }          
    }

    lastSelectedItem = comboBox1.SelectedItem;
}

По сути, вышеприведенный код предлагает средства для возврата ComboBox к его предыдущему выбранному значению без вызова какого-либо кода обработчика событий в процессе.Пользователи кратко увидят изменения в выборе элементов, а затем вернутся назад, если ответят «Нет» во всплывающем окне.

Кроме того, вы правы в своем утверждении, что CancelEdit () по сути ничего не сделает - универсальная коллекция Listне поддерживает обнаружение изменений.Вы можете использовать DataTable или ObservableCollection, которые поддерживают обнаружение изменений.

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