Интерфейс ICancel Add New

если коллекция поддерживает транзакционное добавление

Для поддержки такого сценария был определен интерфейс ICancelAddNew, Позволяющий коллекции выносить решение о принятии либо отклонении нового элемента, добавленного к коллекции посредством методов этого интерфейса. Если коллекция поддерживает транзакционное добавление элементов, в ней должен быть реализован интерфейс ICancelAddNew. Привязанные элементы управления могут тогда вызывать EndNew, Чтобы фиксировать транзакцию добавления нового элемента, либо CancelNew , чтобы отменить добавление. Это позволяет элементу управления вызвать метод списка AddNew, Получить от него новый элемент и начать установку значений нового объекта. Если код вызовет CancelNew С индексом добавленного элемента, новый объект может быть отброшен, не будучи действительно добавленным в коллекцию. Если код вызовет EndNew С этим индексом или произведет над коллекцией какую-то другую операцию, добавление будет зафиксировано. Самому объекту совершенно не нужно знать о своем промежуточном характере принадлежности к коллекции; всем распоряжается сама коллекция.

Такое поведение несколько отличается от того, что можно было бы ожидать. В мире распределенных транзакций с базами данных подразумевается, что вы должны явно фиксировать транзакцию, иначе она будет отменена. В случае интерфейса ICancelAddNew Поведением по умолчанию в соответствии с контрактом, специфицированным инфраструктурой Framework, является фиксация, даже если EndNew Не будет вызван явно. Таким образом, вставка или удаление других элементов, как и установка в качестве текущего другого элемента коллекции, рассматривается как операция, снимающая фокус ввода с добавляемого элемента и фиксирующая его в коллекции. Как класс BindingList, Рассматриваемый в главе 9, так и класс BindingSource Реализуют этот интерфейс для коллекций, которыми они управляют. Поскольку обобщенный класс BindingList Не может знать, что делать с транзакционной семантикой вызовов AddNew Или CancelNew, То для подходящей к вашему сценарию их реализации вам нужно будет произвести от BindingList Новый класс, заменив в нем методы AddNewCore И CancelNewCore Базового класса.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *