Возникли проблемы с пониманием пользовательских элементов управления на C#

StackOverflow https://stackoverflow.com/questions/826861

Вопрос

Я новичок в usercontrols, пока создал только один, так что потерпите немного.Сегодня я читал, что usercontrols должны быть автономными и не полагаться на какую-либо информацию из родительского контейнера.Я понимаю эту часть, но что мне трудно понять, так это "правильный" способ спроектировать мою программу на основе этого принципа.

Я создаю веб-форму на C #, в которой на этой странице есть страница с usercontrol.Я создал usercontrol в его ascx-файле и перетащил его на свою aspx-страницу.Usercontrol - это пара полей даты и gridview для отображения результатов хранимой процедуры SQL.

Я бы действительно хотел повторно использовать этот элемент управления, но я не могу понять, как "сообщить" usercontrol, какую хранимую процедуру я хотел бы запустить для конкретной страницы, на которой я нахожусь, не нарушая правила "не полагаться на родительский контейнер".

Спасибо

Это было полезно?

Решение

Не полагаться на родительский контейнер не означает, что вы не можете общаться.Предоставьте свойство в пользовательском элементе управления, которое установит родительский элемент.Но имейте значение по умолчанию, чтобы оно не выходило из строя.

Кроме того, если это очень специфический элемент управления, нет никаких причин полагаться на родительский элемент.Возможно, это не идеально, но вы бы использовали пользовательский элемент управления для обеспечения разделения кода.

Другие советы

Вашему элементу управления не обязательно знать, откуда взялись его данные.Ему не нужно знать о хранимой процедуре или о чем-либо еще.Все, что ему нужно знать, - это данные, которые он должен показать.Если я правильно понимаю ваш элемент управления, это сетка с некоторыми фильтрами по дате.Он получит данные, покажет эти данные и отфильтрует их по дате.Это нормально, все, что ему нужно знать, - это данные, которые он должен показывать, и, возможно, дату начала и окончания по умолчанию от родительского сервера.

Вы упускаете истинную мощь пользовательских элементов управления, если не разрешаете им взаимодействовать со своим родителем.Я думаю, что в этом случае вы, возможно, заходите слишком далеко в инкапсуляции.

Предположим, у вас есть пользовательский элемент управления, который представляет собой просто таблицу или gridview различных пользовательских данных.Неизбежно, что пользовательскому элементу управления потребуется знать об уникальном идентификаторе пользователя, чтобы извлекать его данные, где бы они ни находились, что, конечно, вынуждает вас создавать общедоступное свойство, которое может устанавливать родительская страница.

Кроме того, имейте в виду, что будут случаи, когда действие в пользовательском элементе управления должно вызвать действие в родительском элементе.Здесь в игру вступают делегаты событий, и они чрезвычайно полезны и, на мой взгляд, делают пользовательские элементы управления еще более полезными.

Просто отбросьте всю идею о том, что пользовательские элементы управления и родители не разговаривают друг с другом, и вам станет намного проще.

Итак, у вас есть какие-то вещи внутри этого пользовательского элемента управления, которые будут привязывать данные к набору данных, возвращаемому хранимой процедурой?

Вот один из способов справиться с этим:Вместо того чтобы пытаться передать хранимую процедуру пользовательскому элементу управления, сделайте набор данных, на который будет опираться пользовательский элемент управления, общедоступным свойством пользовательского элемента управления.

Во время выполнения ваш код, который находится за пределами пользовательского элемента управления, запустит соответствующую сохраненную процедуру и установит для свойства dataset вашего пользовательского элемента управления значение результата, возвращаемого сохраненной процедурой.

Как отмечали все остальные, ваш пользовательский элемент управления должен иметь стандартный способ передачи своих намерений и поведения.Это не означает, что вы должны иметь ссылку на контейнер и, следовательно, знать, что (MyPage.aspx) на самом деле содержит его.

То, что я нашел незаменимым при работе с пользовательскими элементами управления, - это события.Изучайте события и как их использовать.События - отличный способ сообщить о поведении.

В вашем примере я могу разделить ваши критерии (текстовые поля даты) на собственный пользовательский элемент управления.Создайте новый класс, наследуемый от EventArgs, который содержит ваши критерии (DateTime поля).Когда пользователь нажимает кнопку поиск, запускается событие (типа EventHandler<YourEventArgs>) с вашим заказом EventArgs.Страница обработает событие, запросит базу данных, а затем передаст результаты в общедоступный или внутренний метод вашего второго пользовательского элемента управления, который отображает записи.

Ключевым моментом здесь является то, что ваш элемент управления критериями может быть повторно использован на разных страницах, если у вас возникнет необходимость в вызове различных хранимых процедур.Подумайте о сценариях вставки и обновления.Часто элементы пользовательского интерфейса одни и те же.Вы можете создать один элемент управления и использовать его на двух разных страницах с двумя различными вариантами поведения (addRecord.aspx и updateRecord.aspx).Кроме того, ваш элемент управления, отображающий записи, очень легко использовать повторно.

Одним из огромных преимуществ является то, что ваши страницы и элементы управления становятся довольно маленькими.Каждый элемент управления / страница на самом деле касается только своего небольшого подмножества функциональных возможностей.Ваш код станет менее сложным и его будет проще поддерживать.

"сообщите" usercontrol, какую хранимую процедуру я хотел бы запустить

Похоже, вы ищете события / делегатов
Пусть элемент управления предоставляет событие, и пусть родительский элемент добавляет обработчик (возможно, в конструкторе, если вы хотите заставить его добавить одно и только одно событие)
В качестве альтернативы вы могли бы использовать шаблон Command / Strategy - заставить родительский объект инкапсулировать метод и отправить инкапсулирующий объект элементу управления в его конструкторе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top