Войти



Поиск

Реклама

Полезное:

Новые статьи

Опечатка?

Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!

Счетчики


Управление транзакционными добавлениями к коллекции

Если вы поддерживаете транзакционное редактирование объекта, то, вероятно, захотите поддерживать и транзакционное добавление объектного типа к любым коллекциям, которые его содержат. Как уже упоминалось, если вы используете для своих специальных коллекций класс BindingList<T>, вы уже имеете бесплатно транзакционное добавление через комбинацию метода AddNew и реализации методов EndNew и CancelNew интерфейса iCancelAddNew. Однако если элемент управления, к которому вы привязаны, не умеет вызывать эти методы - а многие могут и не уметь, поскольку этот интерфейс появился в .NET 2.0, - вы все же сможете поддерживать транзакционное добавление через реализацию интерфейса IEditableObject.

Этот код условно возвращает различные значения для AllowNew и AllowRemove в зависимости от того, является ли коллекция сортированной или фильтрованной (поддержка фильтрации добавляется далее в этой главе).

Когда все это сделано, вы можете производить свой класс Си s tome г -Collection, а также определять коллекцию Orders, содержащуюся в классе Customer. Теперь как CustomerCollection (привязанная к первой сетке), так и дочерние коллекции с именем Orders для каждого объекта Customer будут поддерживать сортировку:

Для этого вам потребуется допустить некоторое сопряжение между вашим специальным классом коллекции, которая содержит специфический объектный тип, и самим объектным типом. Данная модификация требует, чтобы каждый объект Customer сохранял ссылку на содержащую его коллекцию, так что он мог бы удалить себя при вызове CancelEdit, если знает, что для этого экземпляра объекта еще не был вызван EndEdit. Для поддержки этого вам потребуются еще две переменные в классе Customer: еще один булев флаг для указания «новизны» объекта, в том смысле, что после создания для него еще не вызывался EndEdit, и ссылка на экземпляр родительской коллекции. Затем вам нужно модифицировать CancelEdit и EndEdit, чтобы они использовали флаг и ссылку для удаления объекта из родительской коллекции, если для любого нового объекта CancelEdit вызывается прежде EndEdit. Следующий код показывает модификации, которые необходимы для организации такого взаимоотношения между коллекцией и содержимым объектом.

Когда объект конструируется, флаг mNewObject устанавливается в true. Единственным кодом, который его использует, являются методы CancelEdit и EndEdit интерфейса lEditableObject. Добавленный в CancelEdit код проверяет, является ли текущий объект новым. Если объект Теперь объекты customer будут удалять себя из родительской коллекции, если они добавляются через привязанный элемент управления и последний вызывает CancelEdit прежде EndEdit. Код работает нормально даже в комбинации с реализацией интерфейса ICancelAddNew, которая также обеспечивает удаление объектов из коллекции, если добавление не было принято вызовом EndAdd.




Newer news items:
Older news items:

 
Главная Страница Контактная Информация Поиск по сайту Контактная Информация Поиск по сайту