У меня есть приложение 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?
источников.