У меня есть пользовательский контроль поиска, который я хотел бы сделать общим.
Сам элемент управления будет содержать другой набор элементов управления, зависящих от его контекста. Например, это могут быть элементы запаса, люди, адрес как контекст поиска.
Как я могу сделать это достаточно общим, чтобы на основе контекста поиска он точно знал, что пользователь должен контролировать в форме?
Любой программист может просто перетащить элемент управления пользователя в свою форму, установить его контекст, и мы будем рады.
Моя первая мысль - создать базовый элемент управления для всех отдельных пользовательских элементов управления, а диалог поиска принимает их в конструкторе, чтобы он знал, какие из них будут отображаться во время выполнения. Вы можете создать унаследованные версии базовых элементов управления и передать их. Или, может быть, просто установите контекст поиска (enum), и он покажет, что пользовательские элементы управления находятся во время выполнения.
Все .net 2.0 Winform
Отредактировано для чтения. Q был слишком длинным и подробным до этого.
В нашем проекте мы сделали это, добавив интерфейс ISearchable
с CanSearch
и Search
свойствами. Они приняли аргумент направления, указывающий вперед или назад, а метод поиска также взял строку для выполнения поиска и перечисления, определяющую тип соответствия (начало фразы, конец фразы, включенное в фразу и т.д.).
Затем мы реализовали этот интерфейс для всех элементов управления в иерархии. Каждый элемент управления затем делегировал дочерние элементы управления, как он считал нужным. В нашем контейнерном приложении будет содержаться текстовое поле и найти следующие/предыдущие кнопки. Контейнер запросит первое представление в иерархии интерфейса, которое затем будет привязано к целевому элементу управления, как видно, подойдет каждому элементу управления в иерархии.
Мы применили альтернативный подход для наших операций с буфером обмена, посредством которого мы сначала проверили активно сфокусированное управление, чтобы узнать, поддерживает ли он наш интерфейс ISupportEdit
. Если это не так, мы использовали иерархический подход.