C# для профессионалов. Том II - Симон Робинсон
Шрифт:
Интервал:
Закладка:
Тогда мы должны отключить все элементы управления проверкой по умолчанию, затем включить заново эти элементы управления в обработчике нажатия кнопки и заставить их проверять, прежде чем мы проверим свойство формы IsValid.
Для выполнения всего этого требуется следующее изменение кода. В Page_Load() мы отключаем все элементы управления проверкой. Мы можем использовать для этого коллекцию формы Validators, она содержит все элемента проверки на странице, поэтому мы можем их все перебрать.
private void Page_Load(object sender, System.EventArgs e)
validationSummary.Enabled = false;
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = false;
}
…
}
В методе submitButton_Click() мы сразу включаем все элементы управления проверкой, за исключением итогового, что заставляет их проверять свои соответствующие элементы управления, вызывая метод формы isValid(), и затем проверять, как и раньше, свойство IsValid. Мы добавляем также в эту проверку предложение else, которое снова включает итоговую проверку, если оказывается, что IsValid задан как false. Это предоставляет пользователю обратную связь тогда и только тогда, когда элементы управления имеют недопустимые данные и нажата кнопка отправки.
protected void submitButton_Click(object sender, System.EventArgs e) {
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = true;
}
this.Validated);
if (this.IsValid) {
…
} else {
validationSummary.Enabled = true;
}
}
В результате этого эффективно отключается проверка на клиентской стороне, что стоит затраченных усилий, так как предоставляет дополнительное удобство использования.
ADO.NET и связывание данных
Созданное в предыдущем разделе приложение формы Web является полностью функциональным, но содержит только статические данные. Кроме того, событие процесса заказа не содержит устойчивых данных события. Чтобы решить обе эти проблемы, можно воспользоваться ADO.NET и получить доступ к данным, хранящимся в базе данных, так чтобы можно было сохранять и извлекать данные события вместе со списками помещений и служителей.
Соединение данных делает процесс извлечения данных еще легче. Элементы управления, такие как поля списков (и некоторые из более специальных элементов управления) готовы к использованию этой техники. Они могут быть связаны с любым объектом, который предоставляет интерфейс IEnumerable, ICollection или IListSource, что включает объекты DataTable.
В этом разделе мы начнем с модернизации нашего приложения события заказа помещения, а затем пойдем дальше и рассмотрим некоторые другие вещи, которые можно делать со связыванием данных, используя другие элементы управления Web.
Модернизация приложения заказа помещения
Создадим новое приложение Web с именем PCSWebApp3 и скопируем код из созданного ранее приложения PCSWebApp2. Прежде чем начать новый код, давайте рассмотрим базу данных, к которой мы будем обращаться.
База данных
Для этого примера используем базу данных Microsoft Access с именем PCSWebApp3.mdb, которую можно найти вместе с загружаемым кодом для этой книги. Для учета масштаба предприятия имеет смысл использовать базу данных SQL Server, но хотя используемая техника практически одинакова, но Access все же облегчает процесс тестирования. В ходе изложения будут показаны необходимые различия в коде, когда они возникнут. Представленная база данных содержит три таблицы:
□ Attendees содержит список возможных почетных гостей событий.
□ Rooms содержит список возможных помещений для событий.
□ Events содержит список заказанных событий.
AttendeesТаблица Attendees содержит следующие столбцы:
Столбец Тип Примечания ID AutoNumber, первичный ключ Идентификационный номер почетного гостя Name Text, необходимое значение, 50 символов Имя почетного гостя Email Text, необязательное значение, 50 символов Адрес e-mail почетного гостяБаза данных позволяет хранить сведения о 20 почетных гостях, каждый из которых может иметь адрес e-mail. Другое приложение может автоматически посылать письмо почетным гостям после выполнения заказа. Читателям предлагается реализовать такое приложение в качестве упражнения.
RoomsТаблица Rooms содержит следующие столбцы:
Столбец Тип Примечания ID AutoNumber, первичный ключ Идентификационный номер помещения Room Text, требуемое значение, 50 символов Название помещения EventsТаблица Events содержит следующие столбцы:
Столбец Тип Примечания ID AutoNumber, первичный ключ Идентификационный номер события Name Text, требуемое значение, 255 символов Название события Room Number, требуемое значение Идентификатор помещения для события AttendeeList Memo, требуемое значение Список имен почетных гостей EventData Date/Time, требуемое значение Дата событияНесколько событий представлены в загружаемой базе данных.
Соединение с базой данных
Два элемента управления, которые мы хотели бы связать с данными, — attendeeList и roomList. Чтобы сделать это, мы должны задать свойства DataSource этих элементов управления как таблицы, содержащие данные. Код должен загрузить данные в эти таблицы и выполнить соединение. Оба эти элемента управления имеют также свойства DataTextField и DataValueField, которые определяют, какие столбцы использовать для вывода элементов списка и задания свойств value, соответственно. В обоих случаях можно задать эти свойства во время проектирования как Name и ID, что будет использоваться, как только задается свойство DataSource для заполнения элементами списка элемента управления.
Теперь мы можем сделать это в построителе форм Web. Удалите существующие записи из кода ASP.NET для этих элементов управления. Теперь что объявления будут выглядеть следующим образом:
...
<asp:dropdownlist id="roomList" runat="server" width="160px" datatextfield="Room" datavaluefield="ID" / >
...
<asp:listbox id="attendeeList" runat="server" width="160px" selectionmode="Multiple" rows="6" datatextfield="Name" datavaluefield=" " >
Следующая задача состоит в создании соединения с базой данных. Существует несколько способов это сделать. Как мы видели в главе ADO.NET ранее, обычно для создания нового соединения используется окно Server Explorer. Так как мы работаем с Access, то тип провайдера для этого соединения будет Microsoft Jet 4.0 OLE DB Provider. Когда это будет задано в окне сервера, мы сможем перетащить соединение на форму Web, что добавит объект Data.OleDb.OleDbConnection к форме с именем oleDbConnection1:
public class WebForm1: System.Web.UI.Page {
...
protected System.Data.OleDb.OleDbConnection oleDbConnection1;
Для соединения SQL Server будет добавлен объект SqlClient.SqlConnection.
В метод InitializeComponent() также добавится код для задания свойства ConnectionString формы oleDbConnection1, таким образом все будет готово для использования в коде.
Мы хотим выполнить соединение данных в обработчике событий Page_Load(), так что элементы управления будут полностью заполнены, когда мы захотим использовать их в других частях кода. Приступаем к считыванию данных из базы данных, независимо от того, выполняется ли в данный момент операция обратной отправки (даже если элементы управления списком будут сохранять свое содержимое с помощью viewstate), чтобы гарантировать, что мы имеем доступ ко всем данным, которые могут понадобиться, хотя нам и не нужно выполнять само соединение данных при обратной отправке. Это может показаться слегка расточительным, но читатель при желании может в качестве упражнения добавить дополнительную логику к коду для оптимизации такого поведения. Здесь мы сосредоточимся на том, как заставить все работать, не входя в практические детали.