Категории
Войти
Поиск
Реклама
сейчас 3d телевизор 42LX6500 не опоздайте!|обвитие пуповиной обсудить на форуме.В нашем интернет магазине можете купить зимние шины в Киеве.Полезное:
Новые статьи
Опечатка?
Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!
Счетчики
| Создание специального типа коллекции на основе Bindingl_ist |
|
Допустим, вы хотите создать сильно типизированную коллекцию объектов Customer, которая поддерживает сортировку и поиск, и взять в свои руки контроль над процессом конструирования экземпляров Customer, которые добавляются к коллекции посредством механизмов привязки данных. Первым вашим шагом будет объявление класса, производного от BindingList<T> с соответствующим параметром типа. До сих пор мы в сценариях привязки данных использовали для многих коллекций специальных рабочих объектов класс List<T>. И для многих сценариев может быть вполне достаточно создания специального типа коллекции при помощи обобщенного типа List<T>. Однако когда вы занимаетесь привязкой данных в Windows Forms, класс BindingList<T> предлагает вам более мощные возможности, и, вообще говоря, ему следует отдавать предпочтение. Одним из самых больших отличий является то, что класс Binding-List<T> берет на себя возбуждение событий ListChanged всякий раз, когда объекты коллекции программно добавляются или удаляются. Если вы делаете такие изменения в привязанной коллекции List<T>, привязанные элементы управления не будут обновляться автоматически, так как у них нет способа узнать, что содержимое списка изменилось. Поэтому, если бы вы ввели в обработчик события Click кнопки на форме примера CustomBusinessObjects следующий код, сетка заказчиков не обновлялась бы, показывая новый элемент списка, если только вы не будете взаимодействовать с формой так, что это заставит ее обновить привязку данных, например, с помощью клавиш стрелок передвинете вниз строки в сетке. Помимо запуска событий для добавления, удаления и замены элементов коллекции, класс BindingList<T> поддерживает транзакционные добавления к коллекции посредством реализации интерфейса ICancelAddNew. Интерфейс определяет два метода, EndNew и CancelNew. Когда вызывается AddNew интерфейса IBindingList, в коллекции создается новый элемент. Если вызывается CancelNew, элемент удаляется из коллекции. Как только вызывается EndNew, новый элемент считается окончательно добавленным в коллекцию. Его всегда можно удалить позже, но здесь вы можете создать объект и инициализировать его инкрементно. Если, однако, какой-то этап инициализации не удается, CancelNew позволяет вам откатить добавление к коллекции. Концептуально это очень похоже на реализацию интерфейса lEditableObject, который обсуждался в одном из предыдущих разделов, но разрешает неявную сопряженность, возникающую между объектами, которые реализуют lEditableObject, и содержащими их коллекциями. Реализации для сортировки и поиска в классе BindingList<T> отсутствуют, и свойства SupportsSorting и SupportsSearching возвращают false. Обобщенный класс BindingList<T> не только способен исправить такое положение, но дает вам также больший контроль над привязанной коллекцией и предусматривает способы поддержки сортировки и поиска. Какой бы тип вы ни указали в качестве параметра типа, обобщенный класс Bin-dingList<T> предусматривает обобщенную реализацию интерфейса IBindingList, который обеспечивает сортировку, поиск и уведомления об изменениях. Просто объявив тип на основе BindingList<T> вместо List<T>, вы получаете автоматическую поддержку событий Listchanged, которые будут запускаться коллекцией всякий раз, когда в ней добавляются, удаляются или заменяются элементы. Например, если вы добавите в класс TestData-Generator следующий метод, возвращающий тестовые данные как Bin-dingList<Customer> вместо List<Customer>, и модифицируете код привязки данных, чтобы он вызывал этот метод вместо GetTestCustomers, то, когда вы будете программно добавлять в коллекцию новый элемент, как показано в методе AddCustomer, сетка будет немедленно обновляться, показывая новый элемент коллекции. Если вы вызовете для экземпляра типа BindingList<T> метод ApplySort или Find, он выбросит исключение типа NotSupportedException, поскольку у класса нет общего способа узнать, какого рода алгоритм он должен использовать для сортировки и поиска свойств произвольного типа. Если вы хотите поддерживать сортировку и поиск, вам потребуется реализовать специальный тип, производный от BindingList<T> с соответствующим параметром типа. Базовый класс по-прежнему будет выполнять за вас большую часть работы по организации коллекции и поддержке привязки данных; вам просто потребуется переопределить пару методов, чтобы предоставить действительные алгоритмы сортировки и поиска. Реализуя свой собственный специальный тип, вы можете также взять в свои руки процесс конструирования, когда объекты добавляются к коллекции динамически через привязанный элемент управления, как в случае, когда пользователь начинает печатать в нижней строке элемента управления DataGridView, что позволяет добавлять элементы в коллекцию, как вы увидите далее.
Newer news items:
Older news items:
|
