» ASP
для новичков
» Главная
страница
»
ASP
для новичков
Поиск и отображение
информации
Вернемся к нашему проекту сайта
знакомств. Мы уже создали страницу, при помощи которой посетитель сайта может
внести в базу данных информацию о себе. Теперь необходимо реализовать поиск по
этой базе.
Итак, нам потребуется создать еще
две Web-страницы. На одной из них. посетитель сайта сможет задать условия поиска
по базе данных, а на другой Web-странице ему будет показан результат его
запроса.
Естественно, поиск данных будет
производиться при помощи SQL-запроса, основанного на ключевом слове select.
Однако здесь следует сделать некоторое отступление. В предыдущем примере мы
использовали SQL-запрос, который не возвращал каких-либо данных. SQL-запрос
select обязательно будет возвращать некоторое множество записей из основной
таблицы. Это множество записей будет являться источником данных для
Web-страницы, показывающей результат запроса пользователя. Подобные источники
данных в ASP.NET реализуются при помощи типа DataSet. Его структуру мы
рассмотрим в следующем разделе главы, а в этом разделе мы просто приведем пример
его использования.
Итак, для начала необходимо
спроектировать Web-страницу, на которой пользователь будет указывать критерии
поиска по базе данных. Эту страницу мы назовем search.aspx. Затем, все введенные
данные будут переданы Web-странице с наименованием bind.aspx. При загрузке этой
страницы будет сформирован запрос select, опираясь на критерии пользователя.
Затем этот запрос будет выполнен, и его результаты будут отображены в таблице.
Так как наша база данных очень
невелика, то и критериев поиска будет немного. Мы предоставим пользователю
возможность указать пол пользователей при помощи группы переключателей. В
листинге 4.3 приведен HTML-код страницы в режиме ее разработки.
Лисгинг 4.3
<%@ Page Language="vb"
AutoEventWireup="false" Codebehind="search.aspx.vb" Inherits="dating.
search"%>
lDOCTYPE HTML PUBLIC "-//W3C//DTD
HTML 4.0 Transitional//EN">
<HEAD>
<titlex/title>
<meta content="Microsoft Visual
Studio. NET 7.0" name=" GENERATOR ">
<meta content="Visual Basic 7.0"
name="CODE_LANGUAGE">
<meta content=" JavaScript"
name="vs_defaultClientScript">
ta content="http: //schemas
.microsoft.com/intellisense/ie5"
"vs targetSchema">
</HEAD>
<body MS
POSITIONING="GridLayout">
<form id="Forml" method="post"
runat="server">
<asp: label id="Labell"
style="Z-INDEX: 101; LEFT: 41px;
POSITION: absolute;
TOP: 20px" runat=" server"
Height="19px" Width="196px">Укaжитe критерии поиска</азр: label>
<asp: label id="Labe!2"
style="Z-INDEX: 102; LEFT: 41px;
POSITION: absolute;
TOP: 51px"
runat="server">nc^</asp: label>
<asp:radiobuttonlist
id="RadioButtonListl" style="Z-INDEX: 103; LEFT: 41px;
POSITION: absolute;
TOP: Slpx" runat="server">
<asp:List!tem Value="0"
Selected="True">Myжcкoй</asp:ListItem>
<asp:List!tem
Value="l">Жeнcкий</asp:ListItem>
</asp: radiobuttonlist>
<asp:button id="Buttonl"
style="Z-INDEX: 109; LEFT: 44px;
POSITION: absolute;
TOP: 140px" runat=" server"
Height="24px" Width="120px" Text= "Искать ! ">
</asp:button>
</form>
</body>
</HTML>
При нажатии на кнопку Искать! пользователь должен
быть направлен на другую Web-страницу, которая и будет производить поиск.
Поэтому обработчик нажатия кнопки будет достаточно прост. Полный код класса,
реализующего созданную Web-страницу, приведен в листинге 4.4.
Листинг 4.4
Public Class search
Inherits System. Web. UI . Page
Protected WithEvents Label2 As
System. Web. UI .WebControls .Label
Protected WithEvents
RadioButtonListl
As
System.Web.UI.WebControls.RadioButtonList
Protected WithEvents Label3
As System.Web.UI.WebControls.Label
Protected WithEvents Label4
As System.Web.UI.WebControls.Label
Protected WithEvents Label5
As System.Web.UI.WebControls.Label
Protected WithEvents TextBoxl
As
System.Web.UI.WebControls.TextBox Protected WithEvents TextBox2
As
System.Web.UI.WebControls.TextBox Protected WithEvents Buttonl
As System.Web.UI.WebControls.Button
Protected WithEvents Labell
As System.Web.UI.WebControls.Label
#Region " Web Form Designer
Generated Code "
'This call is required by the Web
Form Designer.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender
As System.Object, ByVal
e As System.EventArgs) Handles
MyBase.Init
'CODEGEN: This method call is
required by the Web. Form Designer
'Do not modify it using the code
editor. InitializeComponent() End Sub
#End Region
Private Sub Page_Load(ByVal sender
As System.Object, ByVal
e As System.EventArgs) Handles
MyBase.Load
'Put user code to initialize the
page here End Sub
Private Sub Buttonl_Click(ByVal
sender As System.Object, ByVal
e As System.EventArgs) Handles
Buttonl.Click
Session.Add("sex",
RadioButtonListl.Selectedlndex) Response.Redirect("bind.aspx")
End Sub
End Class
Видно, что при нажатии
пользователем кнопки, информация, введенная им, передается на следующую страницу
при помощи стандартной коллекции Объекта Session.
Теперь рассмотрим процедуру
создания Web-страницы, которая будет осуществлять поиск и отображение его
результатов. Для отображения результатов поиска мы будем использовать компонент
DataGrid, который позволяет отображать таблицу, связанную с каким-либо набором
данных. Этот компонент имеет множество настроек внешнего вида, которые могут
устанавливаться в визуальном режиме. Для этого в контекстном меню компонента
следует выполнить команду Property Builder (Построитель свойств), и будет
отражено диалоговое окно, в котором и следует устанавливать свойства. однако,
наша задача сейчас не украсить таблицу, а добиться того, чтобы ней отображались
результаты поиска. Поэтому оставим компонент в том , как он создается по
умолчанию. В листинге 4.5 показан HTML-код задаваемой Web-страницы в режиме
разработки.
Листинг 4.5
<%@ Page Language="vb"
AutoEventWireup="false" Codebehind="bind.aspx.vb" jplnherits="dating.bind"%>
<! DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<titlex/title>
<meta content="Microsoft Visual
Studio.NET 7.0" name="GENERATOR">
<meta content="Visual Basic 7.0"
name="CODE_LANGUAGE">
<meta content="JavaScript"
name="vs_defaultClientScript">
<meta content="http:
//schemas.microsoft.com/intellisense/ie5" 1 name="vs_targetSchema">
</HEAD>
<body
MS_POSITIONING="GridLayout">
<form id="Forml" method="post"
runat="server">
<asp:datagrid id="DataGridl"
style="Z-INDEX: 101; LEFT: 28px;
POSITION: absolute;
TOP: 22px" runat="server"
Height="165px" Width="348px" ShowHeader="False"x/asp:datagrid>
</form>
</body>
</HTML>
А теперь, после того, как мы
увидели HTML-код страницы, следует привести исполняемый код ее класса. Он
показан в листинге 4.6.
Листинг 4.6
Public Class bind
Inherits System.Web.UI.Page
Protected WithEvents DataGridl
As
System.Wet^UI.WebControls.DataGrid
#Region " Web Form Designer
Generated Code "
'This call is required by the Web
Form Designer.
<System.Diagnostics.DebuggerstepThrough()>
Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender
As System.Object, ByVal
e As System.EventArgs) Handles
MyBase.Init
'CODEGEN: This method call is
required by the Web Form Designer
'Do not modify it using the code
editor. InitializeComponent() End Sub
#End Region
Private Sub Page_Load(ByVal sender
As System.Object, ByVal
e As System.EventArgs) Handles
MyBase.Load
'Put user code to initialize the
page here
Dim DS As DataSet
Dim DataConnection As
Data.SqlClient.SqlConnection
Dim DataCommand As
Data.SqlClient.SqlDataAdapter
Dim SelectCommand As String =
"select USNAME, EMAIL, ABOUT, AGE from Dating where (SEX = @Sex)"
DataConnection = New
Data.SqlClient.SqlConnection("server=(LOCAL);
_ uid=sa;pwd=;database=Dating")
DataCommand = New
Data.SqlClient.SqlDataAdapter(SelectCommand, DataConnection)
DataCommand.SelectCommand.Parameters.Add(New
Data.SqlClient.SqlParameter("8Sex", System.Data.SqlDbType.Int, 2))
DataCommand.SelectCommand.Parameters("@Sex").Value
= Session.Itern("sex")
DS = New DataSet()
DataCommand.Fill(DS, "Dating")
DataGridl.DataSource = DS
DataGridl.DataBind()
End Sub
End Class
Этот код следует детально
рассмотреть. Поиск и отображение результатов происходят при загрузке
Web-страницы, поэтому мы используем обработчик события page_Load. Также нам
потребуется по одному экземпляру трех раз-S личных объектов. Мы используем уже
знакомый нам объект sqiconnection f для установки соединения с базой данных,
объект sqiDataAdapter, который I предназначен для выполнения SQL-запроса и получения данных из
таблицы, а также объект DataSet, который и получит извлеченные данные, а затем
послужит источником данных для таблицы. Также в процедуре объявля- 1
ется
переменная seiectcommand типа string. В этой переменной будет /храниться
текст -SQL-запроса select. Следует отметить, что в этом запросе также
используется один параметр.
После того, как объявлены все
переменные, создается соединение с базой сданных при помощи конструктора класса
sqiconnection. Затем в коллекцию параметров запроса добавляется параметр
целочисленного типа. С помощью следующего оператора этому параметру
присваивается значение, которое хранилось в элементе коллекции объекта Session.
После этого ''Выполняется метод Fill переменной DataCommand. В качестве
параметров методу передается переменная типа DataSet и наименование таблицы, из
которой извлекаются данные. Этот метод заполняет набор данных DS. Осталось
только соединить полученный набор данных с таблицей DataGridl.
Соединение набора данных с таблицей
происходит при помощи свойства DataSource, присущего компоненту DataGrid. А
после того, как источник данных для таблицы задан, необходимо отобразить данные
в ней. Для этого мы используем метод DataBind. В результате, после запроса
пользователя, все записи из базы данных, удовлетворяющие условию, будут
отображены в таблице. Листинг 4.7
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>
</title>
<meta content="Microsoft Visual
Studio.NET 7.0" name="GENERATOR">
<meta content="Visual Basic 7.0"
name="CODE_LANGUAGE">
<meta content="JavaScript"
name="vs_defaultClientScript">
cmeta
content="http://schemas.microsoft.com/intellisense/ie5"
name="vs_targetSchema">
</HEAD>
<body
MS_POSITIONING="GridLayout">
<form name="Forml" method="post"
action="bind.aspx" id="Forml">
<table cellspacing="0"
rules="all" border="l" id="DataGridl" style="height:165px;width:348px;
border-collapse:collapse;Z-INDEX:
101; LEFT: 28px;
POSITION: absolute;
TOP: 22px">
<tr>
<td>
Татьяна
</tdxtd>
tanya@mail.ru </tdxtd>
У меня серые глаза
</tdxtd>
22
</td>
</trxtr>
<td>
Елена
</tdxtd>
lena@mail. ru </tdxtd>
Я олично готовлю
</td>
<td>
31
</td>
</tr>
<tr>
<td>
Светлана
</tdxtd>
svetagmail.ru
</tdxtd>
Натуральная блондинка
</td>
<td>
19
</td>
</tr>
<tr>
<td>
Вера
</td>
<td>
vera@mail.ru
</tdxtd>
А я не знаю, что про себя
рассказать </tdxtd>
24
</td>
</tr>
</table>
</form>
</body>
</HTML>
В следующем разделе главы мы
рассмотрим структуру объекта Dataset, который позволяет хранить наборы данных и
отображать их на Web-страицах, а пока укажем еще на одну интересную возможность
компонента DataGrid.
В нашем примере таблица не заняла
много места на Web-странице. Но ведь Далеко не всегда объемы получаемых данных
будут настолько малы, что их можно будет разместить на одной Web-странице. В тех
случаях, когда таблица получается слишком большая, ее можно разбить на несколько
страниц. Для этого необходимо в режиме разработки страницы выполнить для объекта
DataGrid команду контекстного меню Property Builder (Построитель
свойств). На отображенном диалоговом окне следует выбрать вкладку Paging
(Разбиение на страницы).
Для того чтобы таблицу можно было
разбивать на несколько частей, каждая из которых отображалась бы на отдельной
Web-странице, следует поставить флажок в независимом переключателе Allow
paging (Разрешить разбиение на страницы). После этого разработчик получает
доступ ко всем остальным органам управления, расположенным на этой вкладке.
Прежде всего, следует указать,
сколько строк таблицы будет размещаться на одной странице. Это количество строк
указывается в поле Page size (Размер страницы). Для того чтобы
пользователь мог перемещаться между страницами, на которых расположена таблица,
следует отображать кнопки перехода между страницами. Активация этих кнопок
произойдет, если в диалоговом окне отметить флажок в независимом переключателе
Show navigation buttons (Показать кнопки управления). Расположение кнопок
управления между страницами регулируется при помощи пунктов выпадающего списка
Position
(Расположение). А текст надписей на этих кнопках указывается в полях
текстового ввода Next Page Button Text (Кнопка текста следующей страницы)
и Previous Page Button Text (Кнопка текста предыдущей страницы).
Итак, мы рассмотрели способы
отображения информации из базы данных в таблице. Теперь следует ознакомиться со
структурой объекта sqiDataAdapter.
Следующий
урок
|