Глава 11
Виртуальная риэлтерская контора
В сети Internet потенциальные покупатели могут получить исчерпывающие описания домов, выставленных на продажу. Подобная информация публикуется на Web-узлах агентств недвижимости, в электронных специализированных газетах, а также на тематических Web-страницах. Посетители осуществляют поиск подходящего варианта, указывая такие данные, как количество спален, общая площадь жилья и цена. Возможно, клиент пожелает пролистать весь список предлагаемого жилья. В этой главе мы рассмотрим несколько страниц, на которых посетителю предоставляется возможность осуществлять поиск подходящего варианта, просматривать списки предложений и знакомиться с подробными описаниями жилья.
Описание проекта
Перед изучением кода ознакомимся с описанием готового Web-узла. Когда посетитель впервые попадает на узел, он видит страницу, изображенную на рис. 11.1.
Рис. 11.1. Домашняя страница риэлтерского узла
Домашняя страница содержит ссылку на страницу Поиск (рис. 11.2).
Рис. 11.2. Страница Поиск, фильтрация не задана
На странице поиска посетитель указывает параметры домов, которые представляют для него интерес и с описаниями которых он хотел бы ознакомиться. К числу таких параметров относятся предельная цена, количество ванных комнат и спален, район города и т. д. Пункты в списке могут быть отсортированы различными способами, критерий сортировки указывается в поле Сортировать по.
Если посетитель решает не ограничивать область поиска, на странице Результаты поиска выводятся все описания из каталога домов (рис. 11.3).
Рис. 11.3. Результаты поиска, полученные без использования фильтра
В заголовке таблицы указывается число записей, соответствующих запросу пользователя. Строки таблицы содержат базовые сведения о каждом доме. Как отобразить полное описание, вы узнаете позже.
Теперь рассмотрим ситуацию, когда посетитель задает критерии поиска (рис. 11.4). Итак, требуется, чтобы цена дома лежала в диапазоне от $100000 до $300000, а дом, в котором имеется, по крайней мере, две ванные комнаты и три спальни, располагался в районе Теремки.
В результате выполнения щелчка на кнопке ОК на экран выводится набор записей, соответствующих заданным условиям (рис. 11.5).
Рис. 11.4. Страница Поиск с установленным фильтром
Рис. 11.5. Страница Результаты поиска с установленным фильтром
Как показано на рисунке, критериям поиска соответствуют пять записей из восьми. Обратите внимание на то, что записи при выводе на экран сортируются по цене дома.
Столбец номера содержит ссылки, предназначенные для перехода к полным описаниям домов (рис. 11.6).
Рис. 11.6. Страница Дом
В верхней части страницы Дом находится код HLCN (Home Listing Catalog Number - номер описания дома в каталоге). Этот номер необходим для того, чтобы со стартовой страницы можно было сразу загрузить нужное описание.
Посетители вводят номер в специальное текстовое поле (элемент управления TextBox). В данном случае посетитель ввел неправильный код (рис. 11.7). Далее, при рассмотрении кода страницы, мы увидим, что в качестве кода HLCN необходимо ввести шестизначное число и нажать кнопку ОК для подтверждения.
Рис. 11.7. Страница с некорректным кодом HLCN
Когда посетитель возвращается на страницу Дом, его вниманию предлагается вся существующая информация о продаваемой недвижимости (даже изображения дома). На рис. 11.6. вы видите два изображения дома, а на рис. 11.8 - четыре.
Описание может быть снабжено любым количеством изображений или не содержать их вообще. Элемент управления DataList позволяет выводить на экран изображения по четыре в ряд.
Рис. 11.8. Страница Дом с четырьмя изображениями дома
База данных проекта
C11.sql
База данных, необходимая для функционирования узла Недвижимость, состоит из двух таблиц. Связи между этими таблицами схематически показаны на рис. 11.9.
Рис. 11.9. Связи между таблицами базы данных узла Недвижимость
Таблица Listings является основной таблицей в базе данных. Она содержит всю текстовую информацию о доме. В таблице ListingPictures хранятся изображения зданий, представленных на узле Недвижимость.
Две таблицы связаны отношением "один-ко-многим". Каждому описанию дома (одной записи в таблице Listings) может соответствовать несколько изображений (записей в таблице ListingPictures), но каждое изображение связано только с одним описанием.
Таблица 11.1. Поля таблиц базы данных
Имя поля | Тип данных | Примечания |
Таблица Listings (файл Listings.txt) |
ListingID | int | Первичный ключ, идентификационный столбец |
HLCN | varchar | Код дома в каталоге. Длина - 6 символов |
HousePrice | money | Стоимость |
Bathrooms | float | Количество ванных комнат |
Bedrooms | int | Количество спален |
HomeLocation | varchar | Район. Длина - 50 символов |
ContactName | varchar | Контактное лицо. Длина - 50 символов |
EmailContact | varchar | Адрес электронной почты. Длина - 50 символов |
PhoneContact | varchar | Номер телефона. Длина - 50 символов |
Address | varchar | Адрес. Длина - 100 символов |
SquareFeet | varchar | Площадь дома. Длина - 50 символов |
YearBuilt | varchar | Год постройки. Длина - 50 символов |
LotSize | varchar | Площадь участка. Длина - 50 символов |
Garage | varchar | Данные о гараже. Длина - 50 символов |
Notes | varchar | Примечания. Длина - 255 символов |
Таблица ListingPictures (файл ListingPictures.txt) |
ImageID | int | Первичный ключ, уникальный идентификатор |
ListingID | int | Внешний ключ для связи с таблицей Listings |
ImagePath | varchar | Имя файла с изображением дома. Длина - 100 символов |
ImageAlt | varchar | Текст, сопровождающий изображение. Длина - 100 символов |
Код проекта
Web-узел Недвижимость состоит из четырех ASP.NET-страниц, на которых используется ряд элементов управления, в том числе DataGrid и Repeater.
В этом разделе описаны способы применения элементов управления на узле Недвижимость, а также выполнен анализ кода, содержащегося на его четырех страницах.
Домашняя страница
Index.aspx
Домашняя страница содержит средства, позволяющие посетителю переходить на страницу Поиск или непосредственно к описанию дома. Тело страницы содержит ASP.NET-тег Form, который задает обработку элементов управления на сервере:
<Form runat="server">
Для отображения заголовка на странице используется элемент управления Label:
<asp:Label
id="lblTitle"
BorderWidth="5px"
BorderStyle=7
BackColor="lightyellow"
Width="439"
Font-Size="22pt"
Font-Name="Comic Sans MS"
Text="<CENTER>Недвижимость</CENTER>"
runat="server"
/>
Следующий элемент управления - TextBox:
<asp:TextBox
id="txtHLCN"
Columns="25"
MaxLength="8"
runat=server
/>
Этот элемент предназначен для ввода посетителем кода HLCN - шестизначного числа. Поскольку к формату значения предъявляются жесткие требования, с данным полем связан элемент управления RegularExpressionValidator:
<asp:RegularExpressionValidator
id="revHLCN"
ControlToValidate="txtHLCN"
ValidationExpression="^\d{6}$"
Display="Dynamic"
Font-Name="Arial"
Font-Size="11"
runat=server>
Номер в каталоге должен состоять из 6 цифр!
</asp:RegularExpressionValidator>
Он проверяет, является ли значение, введенное в поле txtHLCN:
ControlToValidate="txtHLCN"
шестизначным числом:
ValidationExpression="^\d{6}$"
Сообщение об ошибке отображается динамически, поэтому место для него на экране не выделяется заблаговременно:
Display="Dynamic"
В случае ввода неверного значения на экране появляется следующий текст:
Номер в каталоге должен состоять из 6 цифр!
На странице присутствует также элемент управления Button:
<asp:button
id="butOK"
text=" OK "
Type="Submit"
OnClick="SubmitBtn_Click"
runat="server"
/>
Процедура, заданная в параметре OnClick, должна выполняться при активизации кнопки:
OnClick="SubmitBtn_Click"
Итак, при нажатии кнопки OK запускается следующий код:
Sub SubmitBtn_Click (Sender As Object, E As EventArgs)
Response.Redirect ("./listing.aspx?HLCN="_
& txtHLCN.text)
End Sub
В ходе его выполнения посетитель перенаправляется на страницу Дом, куда передается введенный им номер HLCN:
Response.Redirect ("./listing.aspx?HLCN="_
& txtHLCN.text)
Страница Поиск
Searsh.aspx
Код страницы Поиск отображает элементы управления DropDownList, которые позволяют посетителю задавать различные критерии отбора описаний домов, а также определять параметры сортировки результативных данных. На основе выбранных значений формируется SQL-запрос к базе данных, который используется на странице Результаты поиска.
Первый элемент управления на странице - Label - служит для отображения заголовка:
<asp:Label
id="lblTitle"
BorderWidth="5px"
BorderStyle=7
BackColor="lightyellow"
Width="439"
Font-Size="22pt"
Font-Name="Comic Sans MS"
Text="<CENTER>Поиск</CENTER>"
runat="server"
/>
Далее следует набор элементов управления DropDownList. Вот первый из них:
<asp:DropDownList
id="ddlLowestPrice"
runat=server>
<asp:ListItem Value="0" Selected="True">Не задана</asp:ListItem>
<asp:ListItem Value="25000">$25000</asp:ListItem>
<asp:ListItem Value="50000">$50000</asp:ListItem>
<asp:ListItem Value="100000">$100000</asp:ListItem>
<asp:ListItem Value="200000">$200000</asp:ListItem>
<asp:ListItem Value="300000">$300000</asp:ListItem>
<asp:ListItem Value="500000">$500000</asp:ListItem>
</ASP:DropDownList>
Список значений в элементе управления является фиксированным, то есть он не заполняется из базы данных. Обратите внимание на то, что первое значение списка выбирается по умолчанию.
В этом списке посетитель указывает минимальное значение стоимости дома. Следующий элемент управления предназначен для задания максимальной стоимости:
<asp:DropDownList
id="ddlHighestPrice"
runat=server>
<asp:ListItem Value="100000000" Selected="True">Не задана
</asp:ListItem>
<asp:ListItem Value="50000">$50000</asp:ListItem>
<asp:ListItem Value="100000">$100000</asp:ListItem>
<asp:ListItem Value="200000">$200000</asp:ListItem>
<asp:ListItem Value="300000">$300000</asp:ListItem>
<asp:ListItem Value="500000">$500000</asp:ListItem>
<asp:ListItem Value="1000000">$1000000</asp:ListItem>
</ASP:DropDownList>
Еще один элемент управления DropDownList служит для указания минимального количества ванных комнат:
<ASP:DropDownList
id="ddlBaths"
runat=server>
<asp:ListItem Value="0" Selected="True">Не задано</asp:ListItem>
<asp:ListItem Value="1">Не менее 1</asp:ListItem>
<asp:ListItem Value="2">Не менее 2</asp:ListItem>
<asp:ListItem Value="3">Не менее 3</asp:ListItem>
<asp:ListItem Value="4">Не менее 4</asp:ListItem>
</ASP:DropDownList>
Значения, заданные посетителем, будут использоваться для формирования SQL-запроса, который выбирает из базы данных записи, соответствующие критериям. Так, если посетитель выбрал количество ванных комнат "Не менее 1", то в SQL-запрос включается следующее предложение Where:
BathRooms >=1
С помощью приведенного ниже элемента DropDownList определяется желаемое количество спален:
<ASP:DropDownList
id="ddlBeds"
runat=server>
<asp:ListItem Value="0" Selected="True">Не задано</asp:ListItem>
<asp:ListItem Value="2">Не менее 2</asp:ListItem>
<asp:ListItem Value="3">Не менее 3</asp:ListItem>
<asp:ListItem Value="4">Не менее 4</asp:ListItem>
<asp:ListItem Value="5">Не менее 5</asp:ListItem>
</ASP:DropDownList>
Представляет интерес следующий факт. Значение, выбранное по умолчанию в любом элементе управления DropDownList, не задает никаких ограничений. Следовательно, если посетитель не выполнит никаких изменений в полях, он увидит все описания домов.
Очередной элемент DropDownList предназначен для выбора района:
<ASP:DropDownList
id="ddlPartOfTown"
runat=server>
<asp:ListItem Value="" Selected="True">Любой</asp:ListItem>
<asp:ListItem Value="Оболонь">Оболонь</asp:ListItem>
<asp:ListItem Value="Теремки">Теремки</asp:ListItem>
<asp:ListItem Value="Вишенки">Вишенки</asp:ListItem>
<asp:ListItem Value="Подол">Подол</asp:ListItem>
</ASP:DropDownList>
Последний элемент управления DropDownList позволяет задать способ сортировки полученных описаний:
<ASP:DropDownList
id="ddlSort"
runat=server>
<asp:ListItem Value="HousePrice" Selected="True">цене</asp:ListItem>
<asp:ListItem Value="HomeLocation">району</asp:ListItem>
</ASP:DropDownList>
Значение, выбранное посетителем, будет использоваться в предложении Order By запроса SQL.
Цепочку элементов управления на странице завершает элемент Button, активизация которого служит указанием начать обработку формы:
<asp:button
id="butOK"
text=" OK "
Type="Submit"
OnClick="SubmitBtn_Click"
runat="server"
/>
Когда кнопка OK нажата, происходит запуск следующей процедуры:
Sub SubmitBtn_Click(Sender As Object, E As EventArgs)
Session("SearchSQL") = "Select HLCN, HousePrice, " _
& "Convert(varchar(5),BedRooms) + '/' " _
& "+ Convert(varchar(5),BathRooms) as BedBath, " _
& "HomeLocation, " _
& "EmailContact + '<BR>' + PhoneContact " _
& "as ContactInfo From Listings Where " _
& "HousePrice >= " _
& ddlLowestPrice.SelectedItem.Value _
& " and HousePrice <= " _
& ddlHighestPrice.SelectedItem.Value _
& " and BathRooms >= " _
& ddlBaths.SelectedItem.Value _
& " and BedRooms >= " _
& ddlBeds.SelectedItem.Value _
& " and HomeLocation Like '%" _
& ddlPartOfTown.SelectedItem.Value & "%'" _
& " Order By " _
& ddlSort.SelectedItem.Value
Response.Redirect("./search_results.aspx")
End Sub
Процедура формирует и сохраняет в переменной сеанса запрос SQL, который основан на параметрах, заданных посетителем.
Следует отметить, что значения полей Bedrooms и Bathrooms возвращаются как единое целое с символом "/" в качестве разделителя, что определяет их вид на странице результатов поиска.
Контактные данные также возвращаются как единое значение, в котором элементы разделяются HTML-тегом
.
Данные, выбранные посетителем в элементах управления DropDownList, используются в предложении Where запроса SQL.
Район указывается в предложении Like, а параметр, определяющий порядок сортировки, используется в предложении Order By запроса SQL.
В завершение посетитель направляется на страницу Результаты поиска, где он сможет просмотреть записи из базы данных, возвращенные только что сформированным запросом SQL.
Response.Redirect("./search_results.aspx")
Страница Результаты поиска
Search_Results.aspx
На странице Результаты поиска записи, соответствующие требованиям пользователя, выводятся в элементе управления Repeater.
Label - первый элемент управления на странице. В нем выводится заголовок.
<asp:Label
id="lblTitle"
BorderWidth="5px"
BorderStyle=7
BackColor="lightyellow"
Width="439"
Font-Size="22pt"
Font-Name="Comic Sans MS"
Text="<CENTER>Результаты поиска</CENTER>"
runat="server"
/>
В следующем элементе управления Label указывается число записей, соответствующих критериям, которые были заданы посетителем:
<asp:Label
id="lblCount"
Font-Size="15pt"
Font-Name="Comic Sans MS"
runat="server"
/>
В элементе управления Repeater с помощью четырех шаблонов отображается содержимое записей.
<ASP:Repeater
id="repSearchResults"
runat="server"
>
<HeaderTemplate>
<Table width="100%" style="font: 8pt verdana">
<TR style="Background-Color:DFECD8">
<TD><B>Номер</B></TD>
<TD><B>Цена</B></TD>
<TD><B>Спальни/Ванные</B></TD>
<TD><B>Район</B></TD>
<TD><B>Контакт</B></TD>
</TR>
</HeaderTemplate>
<ItemTemplate>
<TR style="Background-Color:FFECD9">
<TD>
<%# "<A HREF=""./listing.aspx?HLCN=" _
& DataBinder.Eval(Container.DataItem, "HLCN") & """>" _
& DataBinder.Eval(Container.DataItem, "HLCN") & "</A>" %>
</TD>
<TD>
<%# FormatCurrency(DataBinder.Eval(Container.DataItem, _
"HousePrice")) %>
</TD>
<TD>
<%# DataBinder.Eval(Container.DataItem, "BedBath") %>
</TD>
<TD>
<%# DataBinder.Eval(Container.DataItem, "HomeLocation") %>
</TD>
<TD>
<%# DataBinder.Eval(Container.DataItem, "ContactInfo") %>
</TD>
</TR>
</ItemTemplate>
<AlternatingItemTemplate>
<TR style="Background-Color:FFECA8">
<TD>
<%# "<A HREF=""./listing.aspx?HLCN=" _
& DataBinder.Eval(Container.DataItem, "HLCN")
_
& """>" & DataBinder.Eval(Container.DataItem, "HLCN") _
& "</A>" %>
</TD>
<TD>
<%# FormatCurrency(DataBinder.Eval(Container.DataItem, _
"HousePrice")) %>
</TD>
<TD>
<%# DataBinder.Eval(Container.DataItem, "BedBath") %>
</TD>
<TD>
<%# DataBinder.Eval(Container.DataItem, "HomeLocation") %>
</TD>
<TD>
<%# DataBinder.Eval(Container.DataItem, "ContactInfo") %>
</TD>
</TR>
</AlternatingItemTemplate>
<footertemplate>
<TR style="Background-Color:DFECD8">
<TD><B>Номер</B></TD>
<TD><B>Цена</B></TD>
<TD><B>Спальни/Ванные</B></TD>
<TD><B>Район</B></TD>
<TD><B>Контакт</B></TD>
</TR>
</Table>
</footertemplate>
</ASP:Repeater>
Элемент управления Repeater позволяет отображать однотипную информацию в формате, который определен заданными в этом элементе шаблонами. В этом случае записи помещаются в таблицу НTML.
Шаблон HeaderTemplate используется до вывода записей на экран.
<HeaderTemplate>
При этом открывается тег Table:
<Table width="100%" style="font: 8pt verdana">
В первой строке таблицы отображаются заголовки столбцов, выделенные полужирным шрифтом:
<TR style="Background-Color:DFECD8">
<TD><B>Номер</B></TD>
<TD><B>Цена</B></TD>
<TD><B>Спальни/Ванные</B></TD>
<TD><B>Район</B></TD>
<TD><B>Контакт</B></TD>
</TR>
</HeaderTemplate>
Шаблон ItemTemplate предназначен для отображения записей, а каждая запись помещается в отдельную строку таблицы.
В начале записи указывается код HLCN, представляющий собой ссылку на страницу Дом:
<TD>
<%# "<A HREF=""./listing.aspx?HLCN=" _
& DataBinder.Eval(Container.DataItem, "HLCN") & """>" _
& DataBinder.Eval(Container.DataItem, "HLCN") & "</A>" %>
</TD>
В следующей ячейке указывается стоимость дома:
<TD>
<%# FormatCurrency(DataBinder. _
Eval(Container.DataItem, "HousePrice")) %>
</TD>
Далее следуют данные о количестве спален и ванных комнат:
<TD>
<%# DataBinder.Eval(Container.DataItem, "BedBath") %>
</TD>
Затем в таблицу помещается информация о месторасположении дома:
<TD>
<%# DataBinder.Eval(Container.DataItem, "HomeLocation") %>
</TD>
Последний столбец HTML-таблицы содержит контактную информацию:
<TD>
<%# DataBinder.Eval(Container.DataItem, "ContactInfo") %>
</TD>
После этого следуют закрывающие теги строки таблицы и шаблона:
</TR>
</ItemTemplate>
В элементе управления Repeater можно задать различные шаблоны для четных и нечетных строк. При выполнении такой установки шаблон ItemTemplate назначался бы первой, третьей, пятой и следующим нечетным строкам, а шаблон AlternatingItemTemplate - второй, четвертой, шестой и следующим четным строкам.
В этом шаблоне используется другой цвет фона:
<TR style="Background-Color:FFECA8">
Шаблон FooterTemplate применяется после вывода всех данных из базы. Перед закрытием HTML-тега Table выводится еще одна строка, которая, как и первая строка таблицы, содержит заголовки столбцов. Такой способ оформления таблицы удобен при наличии большого количества строк в ней.
<TR style="Background-Color:DFECD8">
<TD><B>Номер</B></TD>
<TD><B>Цена</B></TD>
<TD><B>Спальни/Ванные</B></TD>
<TD><B>Район</B></TD>
<TD><B>Контакт</B></TD>
</TR>
</Table>
</footertemplate>
При загрузке страницы выполняется следующий код:
Sub Page_Load(ByVal Sender as Object, ByVal E as EventArgs)
Dim DBConn as OleDbConnection
Dim DBCommand As OleDbDataAdapter
Dim DSHomeData as New DataSet
DBConn = New OleDbConnection("Provider=sqloledb;" _
& "server=localhost;" _
& "Initial Catalog=INETC11;" _
& "User Id=sa;" _
& "Password=yourpassword;")
DBCommand = New OleDbDataAdapter _
(Session("SearchSQL"),DBConn)
DBCommand.Fill(DSHomeData, _
"SearchResults")
repSearchResults.DataSource = _
DSHomeData.Tables("SearchResults").DefaultView
repSearchResults.DataBind()
If DSHomeData.Tables("SearchResults").Rows.Count = 1 Then
lblCount.Text = "Найдена 1" _
& " запись."
Else
lblCount.Text = "Найдено " _
& DSHomeData.Tables("SearchResults").Rows.Count _
& " записи(ей)."
End If
End Sub
Запрос SQL, полученный со страницы Поиск через переменную сеанса, помещается в объект DBCommand:
DBCommand = New OleDbDataAdapter _
(Session("SearchSQL"),DBConn)
Запрос выполняется, а результативные записи заносятся в таблицу SearchResults объекта DataSet:
DBCommand.Fill(DSHomeData, _
"SearchResults")
Между элементом управления Repeater и объектом DataSet устанавливается связь:
repSearchResults.DataSource = _
DSHomeData.Tables("SearchResults").DefaultView
repSearchResults.DataBind()
Наконец, в элемент управления Label помещается число полученных из базы записей. Если возвращена одна запись, строка текста формируется следующим образом:
If DSHomeData.Tables("SearchResults").Rows.Count = 1 Then
lblCount.Text = "Найдена 1" _
& " запись."
Если же возвращено несколько записей, формулировка будет такой:
Else
lblCount.Text = "Найдено " _
& DSHomeData.Tables("SearchResults").Rows.Count _
& " записи(ей)."
End If
Страница Дом
Listing.aspx
На странице Дом выводится полное описание, а также изображения дома, код которого передан на эту страницу.
Первый элемент управления Label используется для вывода заголовка:
<asp:Label
id="lblTitle"
BorderWidth="5px"
BorderStyle=7
BackColor="lightyellow"
Width="439"
Font-Size="22pt"
Font-Name="Comic Sans MS"
runat="server"
/>
Второй элемент Label предназначен для отображения описания дома, которое будет составлено из отдельных значений:
<asp:Label
id="lblHomeInfoBlob"
Font-Size="10pt"
Font-Name="Comic Sans MS"
runat="server"
/>
Для вывода на экран изображений применяется элемент управления DataList:
<asp:DataList id="dlPics" runat="server"
RepeatColumns="4">
<ItemTemplate>
<%# "<IMG SRC=""" & _
DataBinder.Eval(Container.DataItem, "ImagePath")_
& """ ALT=""" & DataBinder._
Eval(Container.DataItem, "ImageAlt") & """>" %>
</ItemTemplate>
</asp:DataList>
Изображения выводятся по четыре в ряд:
RepeatColumns="4">
Используется единственный шаблон:
<ItemTemplate>
В этом шаблоне имя файла изображения помещается в HTML-тег Image:
<%# "<IMG SRC=""" & _
DataBinder.Eval(Container.DataItem, "ImagePath")_
& """ ALT=""" & DataBinder._
Eval(Container.DataItem, "ImageAlt") & """>" %>
</ItemTemplate>
Код страницы выполняется при ее открытии.
Sub Page_Load(ByVal Sender as Object, ByVal E as EventArgs)
If Len(Page.Request.QueryString("HLCN")) = 0 Then
Response.Redirect("./index.aspx")
End If
Dim DBConn as OleDbConnection
Dim DBCommand As OleDbDataAdapter
Dim DSHomeData as New DataSet
DBConn = New OleDbConnection("Provider=sqloledb;" _
& "server=localhost;" _
& "Initial Catalog=INETC11;" _
& "User Id=sa;" _
& "Password=yourpassword;")
DBCommand = New OleDbDataAdapter _
("Select * from Listings Where HLCN = '" _
& Page.Request.QueryString("HLCN") & "'",DBConn)
DBCommand.Fill(DSHomeData, _
"Listing")
If DSHomeData.Tables("Listing").Rows.Count = 0 Then
lblHomeInfoBlob.Text = "Введенный код не найден. " _
& "Возможно, дом продан или снят с продажи.<BR>" _
& "<A HREF=""./index.aspx"">Возврат на стартовую страницу</A>"
Else
lblHomeInfoBlob.Text = _
"<TABLE CellPadding=""3"" style=""font: 10pt verdana"">" _
& "<TR><TD><B>Цена: </B>" _
& FormatCurrency(DSHomeData.Tables("Listing"). _
Rows(0).Item("HousePrice")) _
& "</TD><TD><B>Район: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("HomeLocation") _
& "</TD></TR>" _
& "<TR><TD><B>Спален: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("Bedrooms") _
& "</TD><TD><B>Ванных комнат: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("Bathrooms") _
& "</TD></TR>" _
& "<TR><TD><B>Адрес: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("Address") _
& "</TD><TD><B>Год постройки: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("YearBuilt") _
& "</TD></TR>" _
& "<TR><TD><B>Площадь дома: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("SquareFeet") _
& "</TD><TD><B>Площадь участка: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("LotSize") _
& "</TD></TR>" _
& "<TR><TD><B>Гараж: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("Garage") _
& "</TD><TD><B>Контактное лицо: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("ContactName") _
& "</TD></TR>" _
& "<TR><TD><B>Телефон: </B>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("PhoneContact") _
& "</TD><TD><B>Электронная почта: </B>" _
& "<A HREF=""mailto:" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("EmailContact") _
& """>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("EmailContact") _
& "</A>" _
& "</TD></TR>" _
& "</Table><BR>" _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("Notes")
DBCommand = New OleDbDataAdapter _
("Select ImagePath, ImageAlt " _
& "From ListingPictures Where " _
& "ListingID = " _
& DSHomeData.Tables("Listing"). _
Rows(0).Item("ListingID") _
,DBConn)
DBCommand.Fill(DSHomeData, _
"ListingPics")
dlPics.DataSource = _
DSHomeData.Tables("ListingPics").DefaultView
dlPics.DataBind()
End If
lblTitle.Text = "<CENTER>Дом - " _
& Page.Request.QueryString("HLCN") _
& "</CENTER>"
End Sub