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)
{
}
}
Обратите внимание, как извлекаются данные из 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;
}
Поиск и просмотр книг в АРМ библиотекаря
Создадим сценарий для поиска книг (SearchBook.aspx), использующий master-страницу для АРМ библиотекаря. Книги будем искать по номеру, ISBN, названию (или части названия), автору. На странице разместим текстовые поля для поиска (пусть их названия совпадают с названиями соответствующих столбцов в базе данных).
Поскольку нам нужно выбирать информацию сразу из нескольких таблиц, создадим, как обычно, представление в базе данных. Назовем его vw_books. Это представление состоит из 5 таблиц и визуально выглядит следующим образом:

А его код представлен следующим запросом:
SELECT dbo. books. ISBN, dbo. books. name_book, dbo. books. author,
dbo. books. price, dbo. books. pages, dbo. books. year,
dbo. books. type, dbo. books. image, dbo. categories. name_cat,
dbo. publishers. name_publ, dbo. items. id_item,
dbo. items. state, dbo. status. name_status, dbo. items. status
FROM dbo. books INNER JOIN dbo. items
ON dbo. books. ISBN = dbo. items. ISBN
INNER JOIN dbo. categories
ON dbo. books. id_cat = dbo. categories. id_cat
INNER JOIN dbo. publishers
ON dbo. books. id_publ = dbo. publishers. id_publ
INNER JOIN dbo. status
ON dbo. items. status = dbo. status. id_status
Для доступа к базе данных, как обычно, создадим источник данных типа SQLDataSource. В окне Properties назначим источнику данных в качестве строки соединения ConnectionString ссылку на нашу базу данных ASPNETDB. mdf. C помощью свойства SelectQuery в построителе запросов назначим строку запроса c ложным условием, чтобы по умолчанию выборка была пустая, пока пользователь не задал критерии поиска:
SELECT vw_books.* FROM vw_books WHERE 1!=1
После того как пользователь задаст критерии поиска, ему следует нажать на кнопку «Найти». Серверный обработчик этой кнопки выглядит следующим образом:
protected void Button1_Click(object sender, EventArgs e)
{
bool nodata = true;
SqlDataSource1.SelectCommand = "SELECT * FROM vw_books ";
SqlDataSource1.SelectParameters. Clear();
if (id_item. Text!= "")
{
SqlDataSource1.SelectParameters. Add("id_item",
id_item. Text);
SqlDataSource1.SelectCommand +=
" WHERE id_item=@id_item ";
nodata = false;
}
if (ISBN. Text!= "")
{
SqlDataSource1.SelectCommand +=
nodata? " WHERE " : " AND ";
SqlDataSource1.SelectParameters. Add("ISBN", ISBN. Text);
SqlDataSource1.SelectCommand += " ISBN=@ISBN ";
nodata = false;
}
if (author. Text!= "")
{
SqlDataSource1.SelectCommand +=
nodata? " WHERE " : " AND ";
SqlDataSource1.SelectParameters. Add
("author", author. Text);
SqlDataSource1.SelectCommand += " author=@author ";
nodata = false;
}
if (name_book. Text!= "")
{
SqlDataSource1.SelectCommand +=
nodata? " WHERE " : " AND ";
SqlDataSource1.SelectParameters. Add("name_book",
name_book. Text);
SqlDataSource1.SelectCommand +=
" name_book LIKE '%'+@name_book+'%'";
nodata = false;
}
if (nodata)
{
SqlDataSource1.SelectCommand =
"SELECT * FROM vw_books WHERE 1!=1";
}
}
Рассмотрим код этого обработчика более подробно. В этом обработчике мы явно создаем параметры запроса и добавляем их в коллекцию параметров SelectParameters источника данных.
Обратите внимание, как формируется условие запроса. Дело в том, что оно должно начинаться с ключевого слова WHERE, а если условие составное, то отдельные его части в нашем случае должны быть связаны ключевым словом AND (одновременное выполнение нескольких условий). Для краткости используем тернарный (условный) оператор; вспомним, что он имеет следующий синтаксис:
условие? значение_если_истина : значение_если_ложь
Обратите также внимание на то, как формируется условие поиска по подстроке в названии книги. Здесь мы используем ключевое слово LIKE, а сама подстрока поиска в запросе должна обрамляться слева и справа знаками ‘%’.
Если ни один из критериев поиска не задан, снова формируем запрос с ложным условием:
"SELECT * FROM vw_books WHERE 1!=1"
Теперь можно вывести результаты запроса на экран. Будем использовать элемент управления GridView.
Элементу GridView обязательно нужно назначить источник данных: свойство DataSourceID связать с соответствующим объектом типа SQLDataSource.
Как и в предыдущем параграфе, для настройки отдельных столбцов таблицы используйте свойство Columns и соответствующий построитель. Здесь в визуальном режиме можно настроить список столбцов, задать их порядок, заголовки и прочие свойства.

Зададим в объекте GridView несколько новых для нас свойств. Щелкните по объекту правой кнопкой мыши и в контекстном меню выберите строку Show smart tag. Здесь отметим флажки Enable paging и Enable selection.
Включение режима Enable paging приводит к автоматическому разбиению нашей таблицы на страницы (по умолчанию на странице помещается 10 строк).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |


