WinForms dataBinding 2 раза вызывает событие CheckedChanged и делает checkBox неактивным - PullRequest
1 голос
/ 12 февраля 2020

Код ниже взят из простого тестового приложения, содержащего только один флажок в форме.

DataTable dt;

public Form1()
{
    InitializeComponent();

    dt = new DataTable(); 
    dt.Columns.Add("bool", typeof(bool));
    dt.Columns.Add("s", typeof(string));
    dt.Rows.Add(new object[2] { false, "" });
    checkBox1.DataBindings.Add("Checked", dt, "bool", false, DataSourceUpdateMode.OnValidation);
    checkBox1.CheckedChanged += CheckBox_CheckedChanged;
}

private void CheckBox_CheckedChanged(object sender, EventArgs e)
{
    dt.Rows[0]["s"] = "test";
}

Эта строка dt.Rows[0]["s"] = "test"; делает флажок неактивным. CheckedChanged запускается 2 раза. Первый раз после ответа на событие нажатия. Второй раз вызывается внешним кодом, показывающим в стеке CurrencyManager и BindingManagerBase.PushData.

Если я удаляю эту строку или запускаю ее по таймеру, поведение checkBox будет нормальным.

1 Ответ

2 голосов
/ 12 февраля 2020

Измените режим обновления источника данных на OnPropertyChanged.

Когда режим обновления источника данных включен OnValidation, когда происходит CheckedChanged, значение все еще не записывается в источник данных, потому что нет проверка произошла. Таким образом, источник данных все еще имеет предыдущее состояние проверки. Затем, после изменения значения в источнике данных, независимо от того, какой столбец вы обновляете, привязки данных пытаются передать sh последние значения текущих записей в элементы управления. Поэтому проверенное значение не изменится и всегда будет отображать значение столбца bool текущей строки.

Вы также можете попробовать это, сохранив режим обновления источника данных как OnValidation:

checkBox1.DataBindings["Checked"].WriteValue();
dt.Rows[0]["s"] = "test";

Что в основном делает то же самое, что и установка режима обновления на OnPropertyChanged.

...