Пинягина о. В
Вид материала | Документы |
СодержаниеЭтап 5. Разработка сценариев поиска и просмотра данных Сценарий поиска и просмотра читателя в АРМ библиотекаря Header Template Auto Format |
Этап 5. Разработка сценариев поиска и просмотра данных
В каждом АРМ так или иначе нужен режим поиска и просмотра данных в разных разрезах. Рассмотрим подробнее сценарии поиска и просмотра данных в АРМ библиотекаря.
Сценарий поиска и просмотра читателя в АРМ библиотекаря
Создадим сценарий для поиска читателя (SearchReader.aspx), использующий master-страницу для АРМ библиотекаря. Будем искать читателя по номеру его читательского билета или (если он, например, потерял свой читательский билет и забыл его номер) по номеру паспорта.
На странице разместим два текстовых поля (txt_searct_ID и txt_search_pasp) и две кнопки (searchId и searchPasp).
Для доступа к базе данных, как обычно, создадим источник данных типа SQLDataSource. В окне Properties назначим источнику данных в качестве строки соединения ConnectionString ссылку на нашу базу данных ASPNETDB.mdf. C помощью свойства SelectQuery в построителе запросов назначим строку запроса
SELECT readers.* FROM readers where passport=@id_reader
создадим параметр запроса @id_reader и свяжем его с текстовым полем txt_searct_ID.
Поместим на страницу объект DetailesView из группы Data вкладки Tools. Этот объект удобен для вывода подробной информации из одной записи таблицы базы данных. Настроить внешний вид этого объекта можно с помощью многочисленных свойств в окне Properties. Обязательно нужно назначить свойство DataSourceID, т.е., связать с источником данных. Для настройки отдельных полей записи используйте свойство Fields.
Стиль таблицы (цвет, шрифт и т.п.) можно быстро изменить через контекстное меню (правая кнопка мыши) – Auto Format.
Пункт Edit Templates в контекстном меню позволяет также редактировать шаблон верхнего и нижнего колонтитулов объекта ( Header Template и Footer Template), а также задать шаблон для пустой выборки (Empty Data Template) – добавим в этот шаблон строку «Читатель не найден!».
Получившийся объект в коде программы выглядит следующим образом:
AutoGenerateRows="False" CellPadding="4"
DataSourceID="SqlDataSource1" ForeColor="#333333"
GridLines="None" Height="50px" Width="528px">
HorizontalAlign="Center"/>
HeaderText="Номер билета"
InsertVisible="False" SortExpression="id_reader" />
SortExpression="fio_reader" />
SortExpression="passport" />
HeaderText="Дата рождения"
SortExpression="datebird" />
SortExpression="addr_reader" />
SortExpression="tel_reader" />
SortExpression="email_reader" />
Читатель не найден!
Наконец, нужно назначить обработчики на кнопки:
protected void searchPasp_Click(object sender, EventArgs e)
{
SqlDataSource1.SelectParameters.Clear();
SqlDataSource1.SelectParameters.Add("passport",
txt_search_pasp.Text);
SqlDataSource1.SelectCommand =
"SELECT readers.* FROM readers WHERE passport=@passport";
}
protected void searchID_Click(object sender, EventArgs e)
{
try
{
int id = Int32.Parse(txt_search_ID.Text);
SqlDataSource1.SelectParameters.Clear();
SqlDataSource1.SelectParameters.Add("id_reader",
txt_search_ID.Text);
SqlDataSource1.SelectCommand =
"SELECT readers.* FROM readers WHERE id_reader=@id_reader";
}
catch(Exception ex)
{
SqlDataSource1.SelectCommand =
"SELECT readers.* FROM readers WHERE 1!=1";
}
}
Как видите, в первом обработчике «Поиск по паспорту» мы очищаем список параметров, явно задаем параметр поиска @passport и текст команды Select для источника данных – все остальное будет сделано автоматически.
А при поиске по номеру билета возникает следующая проблема: номер билета представляет собой целое число (int), и если пользователь наберет в поле поиска нечисловые символы, то при выполнении Select возникнет исключение (к сожалению, это произойдет за пределами данной функции). Здесь предлагается следующее решение: мы пытаемся преобразовать значение из текстового поля к целому типу, и в случае успеха формируем обычный текст запроса Select. Если же возникло исключение, мы искусственно создаем такой Select, который содержит ложное условие, и выборка будет пустой.
Как только библиотекарь нашел какого-то читателя, он начинает работать с его карточкой. В этот момент создадим переменные сессии для имени и номера читателя. Для этого будем использовать объект Session.
Удобнее всего выполнить это действие в тот момент, когда объект DetailsView заполняется данными, а именно в обработчике события DataBound. (Здесь есть еще одна хитрость: скопируем номер читательского билета в поле txt_search_ID, чтобы при дальнейших действиях со страницей не потерять связь с источником данных, который по умолчанию имеет параметр, связанный с этим текстовым полем.)
protected void DetailsView1_DataBound(object sender, EventArgs e)
{
try
{
Session.Add("id_reader", DetailsView1.Rows[0].Cells[1].Text);
Session.Add("fio_reader", "Читатель: "
+DetailsView1.Rows[1].Cells[1].Text);
txt_search_ID.Text=Session["id_reader"].ToString();
}
catch (Exception ex)
{
Label1.Text = "Поиск читателя";
}
}
Обратите внимание, как извлекаются данные из DetailsView. Номер билета берем из нулевой строки, первого столбца, ФИО – из первой строки, первого столбца. Для удобства будем выводить ФИО найденного читателя сразу же после линейки меню. Для этого в мастер-страницу поместим строку:
<%=Session["fio_reader"]%>
Далее добавим в карточку читателя информацию о его заявках на книги, о взятых и возвращенных книгах.
Прежде всего, для удобства выборки информации из разных таблиц создадим три представления непосредственно в базе данных.
Представление vw_orders содержит информацию о еще не выполненных заявках (дата выдачи пустая). Выборка отсортирована в порядке убывания даты заявки.
SELECT dbo.books.ISBN, dbo.books.name_book, dbo.items.id_item,
dbo.orders.date_order, dbo.books.author,
dbo.orders.id_reader, dbo.items.status,
dbo.orders.id_order
FROM dbo.orders INNER JOIN dbo.items
ON dbo.orders.id_item = dbo.items.id_item
INNER JOIN dbo.books
ON dbo.items.ISBN = dbo.books.ISBN
WHERE (dbo.orders.date_get IS NULL)
ORDER BY dbo.orders.date_order DESC
Представление vw_given содержит информацию о книгах, которые находятся на руках у читателя: (дата выдачи непустая, дата возврата пустая). Выборка отсортирована в порядке убывания даты выдачи.
SELECT dbo.items.id_item, dbo.orders.id_reader,
dbo.books.name_book, dbo.books.author,
dbo.orders.date_get, dbo.books.ISBN, dbo.orders.id_order
FROM dbo.items INNER JOIN dbo.orders
ON dbo.items.id_item = dbo.orders.id_item
INNER JOIN dbo.books
ON dbo.items.ISBN = dbo.books.ISBN
WHERE (dbo.orders.date_return IS NULL)
AND (dbo.orders.date_get IS NOT NULL)
ORDER BY dbo.orders.date_get DESC
Представление vw_returned содержит информацию о книгах, которые возвращены читателем: (дата возврата непустая). Выборка отсортирована в порядке убывания даты выдачи.
SELECT dbo.books.ISBN, dbo.books.name_book, dbo.books.author,
dbo.items.id_item, dbo.orders.date_get,
dbo.orders.date_return, dbo.orders.id_reader,
dbo.orders.id_order
FROM dbo.books INNER JOIN dbo.items
ON dbo.books.ISBN = dbo.items.ISBN
INNER JOIN dbo.orders
ON dbo.items.id_item = dbo.orders.id_item
WHERE (dbo.orders.date_return IS NOT NULL)
ORDER BY dbo.orders.date_get DESC
На основе каждого из представлений создадим источник данных SQLDataSource. Нас интересуют книги конкретного читателя, поэтому в источнике данных при построении запроса в свойстве SelectQuery зададим параметр id_reader, который свяжем с элементом управления DetailsView1 и добавим соответствующее условие в запрос:
SELECT vw_given.* FROM vw_given WHERE (id_reader=@id_reader)
Кроме того, у элемента управления DetailsView1 нужно явно указать ключевые поля из источника данных: назначим свойство DataKeyNames=id_reader.
Теперь можно выводить информацию из источников данных на страницу. Для этого будем использовать элементы управления типа GridView, которые представляют данные в табличной форме. У этих элементов обязательно нужно назначить источник данных: свойство DataSourceID связать с соответствующим объектом типа SQLDataSource.
Для настройки отдельных столбцов таблицы используйте свойство Columns и соответствующий построитель. Здесь в визуальном режиме можно настроить список столбцов, задать их порядок, заголовки и прочие свойства.
Стиль таблицы (цвет, шрифт и т.п.) можно быстро изменить через контекстное меню (правая кнопка мыши) – Auto Format.
Наконец, для более компактного размещения информации будем выводить на экран только один из объектов GridView. Для этого у всех объектов GridView назначим по умолчанию свойство Visible=false. Затем в нижнем колонтитуле объекта DetailsView1 (в шаблоне Footer Template) поместим три кнопки: «Заявки», «Книги выданные», «Книги возвращенные». Обработчик соответствующей кнопки делает видимым одну из таблиц и делает невидимыми две остальные:
protected void Button1_Click(object sender, EventArgs e)
{
GridView1.Visible = true;
GridView2.Visible = false;
GridView3.Visible = false;
}