DataBinding Winforms контролирует обнуляемые типы блокирует графический интерфейс - PullRequest
0 голосов
/ 30 октября 2019

У меня есть приложение Winforms, которое позволяет пользователю редактировать массив объектов. Объект выбирается нажатием на строку в DataGridView и привязывается к различным элементам управления. Недавно я хотел, чтобы объект мог обрабатывать нулевые значения (для полей без данных еще). Это было достигнуто с использованием соглашения type?.

private PDAFiles? pdafile;
public new PDAFiles? PDAFile
{
    get { return this.pdafile; }
    set { this.pdafile = value; }
}

Некоторая дополнительная обработка (посредством пользовательского форматирования) позволяет правильно читать и писать поля. Тем не менее, ввод значения в элемент управления блокирует графический интерфейс.

Мой код работал, как и предполагалось, до реализации обнуляемых типов type?. Просмотр переменных в отладчике показывает, что все значения прочитаны / записаны правильно. Программа не выдает никаких исключений. С большинством элементов управления, включая кнопку закрытия, нельзя взаимодействовать. С DataGridView, который выбирает объект для привязки, можно взаимодействовать, и выбор другого объекта / добавление объекта восстанавливает функциональность.

Привязка данных в элементе управления ComboBox:

Binding binding = new Binding("SelectedIndex", this.current_criteria, "PDAFile", true);
binding.Format += (sender, e) =>
{
    try
    {
        e.Value = e.Value == null ? -1 : e.Value;
    }
    catch { }
};
this.signalFileBox.DataBindings.Add(binding);

Удаление этих строк приводит к исчезновению проблемы. Однако, поскольку элемент управления больше не привязан к базе данных, он не загружает существующие значения из объекта. Отдельная привязка анализирует пользовательский ввод. Удаление парсера не влияет на блокировку графического интерфейса. Настройка DataSource из DataGridView:

this.selected_row_index = this.dataGridViewCriteria.CurrentCell.RowIndex;
MultiDataCollectionCriteria sources =
    new MultiDataCollectionCriteria
    (
        (from row in this.dataGridViewCriteria.SelectedRows.Cast<DataGridViewRow>() 
        select this.data_criteria_source[row.Index] as DataCollectionCriteria).ToArray()
    );
this.current_criteria.DataSource = sources;
this.criteriaPanel.Enabled = true;

Эти строки функционируют как задумано;однако, как уже отмечалось, выбор новой строки из DataGridView разблокирует графический интерфейс.

Я ищу возможности привязать элементы управления к обнуляемым типам (с форматированием) без блокировки графического интерфейса. Поведение будет идентичным обычному DataBinding, за исключением того, что оно может обрабатывать type? источников.

1 Ответ

0 голосов
/ 30 октября 2019

Подобный вопрос был задан здесь
Лучший способ привязать данные элемента управления Winforms к обнуляемому типу? Проблема была решена путем изменения привязки на Binding binding = new Binding("SelectedIndex", this.current_criteria, "PDAFile", true, DataSourceUpdateMode.Never, -1);DataSourceUpdateMode.Never был особенно важен, в отличие от DataSourceUpdateMode.OnPropertyChanged, так как я вручную анализировал ввод с помощью отдельных средств.

...