Программная установка значений параметров ObjectDataSource (C#)

по Скотт Митчелл

Скачивание примера приложения или Загрузка PDF-файла

В этом учебнике мы рассмотрим добавление метода к DAL и BLL, который принимает один входной параметр и возвращает данные. В этом примере этот параметр будет задан программно.

Введение

Как было показано в предыдущем учебном курсе, для декларативной передачи значений параметров в методы ObjectDataSource можно использовать ряд параметров. Если значение параметра жестко запрограммировано, поступает из веб-элемента управления на странице или находится в любом другом источнике, который читается источником данных Parameter объектом, например, это значение может быть привязано к входному параметру без написания строки кода.

Однако могут возникнуть случаи, когда значение параметра поступает из некоторого источника, который еще не учитывается одним из встроенных источников данных Parameter объектов. Если наш сайт поддерживал учетные записи пользователей, может потребоваться задать параметр на основе идентификатора пользователя, вошедшего в систему в текущий момент. Или может потребоваться настроить значение параметра перед его отправкой в метод базового объекта ObjectDataSource.

Каждый раз, когда вызывается метод Select ObjectDataSource, ObjectDataSource сначала создает свое событие SELECT. Затем вызывается метод базового объекта ObjectDataSource. После этого срабатывает выбранное событие ObjectDataSource (рис. 1 иллюстрирует эту последовательность событий). Значения параметров, передаваемые в метод базового объекта ObjectDataSource, можно задать или настроить в обработчике событий для события Selecting.

выбранное событие ObjectDataSource и события выбора вызываются до и после вызова метода базового объекта

Рис. 1. события Selected и Selecting ObjectDataSource срабатывают до и после вызова метода базового объекта (щелкните, чтобы просмотреть изображение с полным размером)

В этом учебнике мы рассмотрим добавление метода к DAL и BLL, который принимает один входной параметр Month, типа int и возвращает объект EmployeesDataTable, заполненный такими сотрудниками, годовщина найма которых находится в указанном Month. В нашем примере этот параметр будет задан программно на основе текущего месяца, в котором отображается список «годовщины сотрудников в этом месяце».

Приступим.

Шаг 1. Добавление метода вEmployeesTableAdapter

Для нашего первого примера необходимо добавить средства для получения тех сотрудников, чьи HireDate произошли в указанный месяц. Чтобы обеспечить эту функциональность в соответствии с нашей архитектурой, необходимо сначала создать метод в EmployeesTableAdapter, который сопоставляется с соответствующей инструкцией SQL. Чтобы выполнить это, сначала откройте типизированный набор данных Northwind. Щелкните правой кнопкой мыши метку EmployeesTableAdapter и выберите команду Добавить запрос.

добавить новый запрос в Емплойистаблеадаптер

Рис. 2. Добавление нового запроса в EmployeesTableAdapter (щелкните, чтобы просмотреть изображение с полным размером)

Выберите, чтобы добавить инструкцию SQL, которая возвращает строки. Когда вы найдете на экран указание SELECT оператора, будет уже загружена инструкция SELECT по умолчанию для EmployeesTableAdapter. Просто добавьте в предложение WHERE: WHERE DATEPART(m, HireDate) = @Month. DatePart — это функция T-SQL, которая возвращает определенную часть даты типа datetime; в этом случае мы используем DATEPART для возврата месяца HireDate столбца.

возвращать только те строки, в которых столбец HireDate меньше или равен параметру @HiredBeforeDate

Рис. 3. возврат только тех строк, в которых столбец HireDate меньше или равен параметру @HiredBeforeDate (щелкните, чтобы просмотреть изображение с полным размером)

Наконец, измените имена методов FillBy и GetDataBy на FillByHiredDateMonth и GetEmployeesByHiredDateMonthсоответственно.

выбрать более подходящие имена методов, чем Филлби и Жетдатаби

Рис. 4. выбор более подходящих имен методов, чем FillBy и GetDataBy (щелкните, чтобы просмотреть изображение с полным размером)

Нажмите кнопку Готово, чтобы завершить работу мастера и вернуться к области конструктора набора данных. Теперь EmployeesTableAdapter должен включать новый набор методов для доступа к сотрудникам, нанятым в течение указанного месяца.

новые методы появляются в область конструкторае набора данных.

Рис. 5. новые методы отображаются в область конструкторае набора данных (щелкните, чтобы просмотреть изображение с полным размером)

Шаг 2. Добавление методаGetEmployeesByHiredDateMonth(month)к слою бизнес-логики

Так как наша архитектура приложения использует отдельный слой для бизнес-логики и логики доступа к данным, нам нужно добавить к BLL метод, который обращается к DAL для получения сотрудников, нанятых до указанной даты. Откройте файл EmployeesBLL.cs и добавьте следующий метод:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
    return Adapter.GetEmployeesByHiredDateMonth(month);
}

Как и в случае с другими методами в этом классе, GetEmployeesByHiredDateMonth(month) просто вызывает DAL и возвращает результаты.

Шаг 3. Отображение сотрудников, годовщина найма которых находится в этом месяце

Последний шаг в этом примере — отображение сотрудников, годовщина найма которых составляет этот месяц. Начните с добавления элемента управления GridView на страницу ProgrammaticParams.aspx в папке BasicReporting и добавьте новый элемент управления ObjectDataSource в качестве источника данных. Настройте ObjectDataSource для использования класса EmployeesBLL, SelectMethod для которого задано значение GetEmployeesByHiredDateMonth(month).

использования класса Емплойисблл

Рис. 6. использование класса EmployeesBLL (щелкните, чтобы просмотреть изображение с полным размером)

SELECT из метода Жетемплойисбихиреддатемонс (month)

Рис. 7. выбор из метода GetEmployeesByHiredDateMonth(month) (щелкните, чтобы просмотреть изображение с полным размером)

На последнем экране будет предложено указать источник значения параметра month. Так как это значение будет задано программно, оставьте параметр Источник параметра значение по умолчанию нет и нажмите кнопку Готово.

параметр источнику параметра оставить значение нет

Рис. 8. Оставьте параметр Источник параметра равным None (щелкните, чтобы просмотреть изображение с полным размером).

Будет создан объект Parameter в коллекции SelectParameters ObjectDataSource, для которой не указано значение.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
    <SelectParameters>
        <asp:Parameter Name="month" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

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

Щелкните значок с молнией в окне "Свойства", чтобы получить список событий веб-элемента управления

Рис. 9. Щелкните значок с молнией в окне свойств, чтобы получить список событий веб-элемента управления

Оба подхода добавляют новый обработчик событий для события Selecting ObjectDataSource в класс кода программной части страницы. В этом обработчике событий можно выполнять чтение и запись значений параметров с помощью e.InputParameters[parameterName], где parameterName является значением атрибута Name в теге <asp:Parameter> (InputParameters коллекция также может индексироваться по порядковому номеру, как в e.InputParameters[index]). Чтобы задать для параметра month текущий месяц, добавьте следующий объект в обработчик событий Selecting:

protected void ObjectDataSource1_Selecting
    (object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["month"] = DateTime.Now.Month;
}

При просмотре этой страницы в браузере мы видим, что только один сотрудник был нанят в этом месяце (март) Мария Каллахан, которая была в компании с 1994.

сотрудников, годовщины которых показаны в этом месяце

Рис. 10. показаны сотрудники, годовщины которых отображаются в этом месяце (щелкните, чтобы просмотреть изображение с полным размером)

Сводка

Хотя значения параметров ObjectDataSource обычно могут быть заданы декларативно, не требуя строки кода, можно легко задать значения параметров программным способом. Все, что нам нужно сделать, — это создать обработчик событий для события Selecting ObjectDataSource, который срабатывает перед вызовом метода базового объекта, и вручную задать значения для одного или нескольких параметров через коллекцию InputParameters.

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

Поздравляем с программированием!

Об авторе

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998. Скотт работает как независимый консультант, преподаватель и модуль записи. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа. Он доступен по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Специальная благодарность

Эта серия руководств была рассмотрена многими полезными рецензентами. Специалист по интересу для этого руководства был Хилтон Гизнау. Хотите ознакомиться с моими будущими статьями MSDN? Если это так, расположите строку в mitchell@4GuysFromRolla.com.