Значение данных в текстовом поле / флажке неверно, пока текстовое поле / флажок не проверен - PullRequest
6 голосов
/ 18 ноября 2010

У меня есть флажок winforms, который привязан к свойству сущности Entity Framework.

Так, например, у меня есть bindingSource.DataSource = myDog с флажком, связанным со свойством IsSleeping, так что когда пользователь устанавливает флажок, IsSleeping становится истинным, а когда пользователь снимает флажок, IsSleeping становится ложь.

Это отлично работает. Проблема заключается в том, что значение IsSleeping не обновляется до тех пор, пока флажок не будет подтвержден, что происходит только тогда, когда фокус перемещается на от от флажка к чему-либо другому. Таким образом, если я хочу, чтобы что-то произошло, когда флажок снят:

private void IsSleepingCheckbox_CheckedChanged(object sender, EventArgs e)
{
    OnDogPropertyChanged(myDog);
    MyAnimalEntities.SaveChanges();
}

myDog.IsSleeping будет по-прежнему верным до тех пор, пока флажок Validated не будет повышен. Таким образом, когда бедный myNaughtyKitty (который слушает событие DogPropertyChanged) приходит поесть из пищевого блюда myDog, думая, myDog спит, myDog действительно просто просыпается вверх! О, нет!

Еще хуже , MyAnimalEntities.SaveChanges() пока не видит изменений в myDog, поэтому значение IsSleeping никогда не сохраняется в базе данных. Перемещение вызова .SaveChanges() на IsSleepingCheckbox_Validated не решает эту проблему, потому что если флажок установлен, но форма закрыта, не перемещая фокус из флажка, флажок никогда проверено и, следовательно, его состояние никогда не сохраняется!

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

Ответы [ 2 ]

8 голосов
/ 18 ноября 2010

Вы можете изменить свойство Binding.DataSourceUpdateMode на OnPropertyChanged (по умолчанию OnValidation), что приведет к обновлению источника данных, когда пользователь установит флажок.К сожалению, событие CheckedChanged все еще срабатывает до обновления источника данных.

Чтобы справиться с этим, вы можете обработать событие BindingSource.ListChanged и переместить туда свой код SaveChanges.

bindingSource = new BindingSource();
bindingSource.DataSource = myDog;
checkBox1.DataBindings.Add(new Binding("Checked", bindingSource, "IsSleeping"));
checkBox1.DataBindings[0].DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;

bindingSource.ListChanged += new ListChangedEventHandler(bindingSource_ListChanged);

HTH

0 голосов
/ 30 июля 2014

Это подходящий способ сделать эту работу.Обработка события проверки CheckBox

    /// <summary>
    /// Handles Check Box State if Changed
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void checkBoxBidSummaryItem_Validated(object sender, EventArgs e)
    {
        // Code to execute...
        _MyEntity.Save(_businessObject.SelectedBid);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...