- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания C# для профессионалов. Том II - Симон Робинсон
Шрифт:
Интервал:
Закладка:
Весь наш код будет помещен между вызовами методов Open() и Close() нашего объекта соединения:
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;
}
oleDbConnection1.Open();
if (!this.IsPostBack) {
calendar.SelectedDate = System.DateTime.Now;
}
OleDbConnection1.Close();
}
Мы вскоре увидим, почему задание данных календаря оставлено внутри этого кода проверки обратной отправки.
Для обмена данными нам необходимо использовать несколько объектов хранения данных. Мы можем объявить их на уровне класса, чтобы мы имели к ним доступ из других функций. Нам понадобится объект DataSet для хранения информации базы данных, три объекта OleDb.OleDbDataAdapter для выполнения запросов на множестве данных и объект DataTable хранения событий для последующего доступа. Они объявляются следующим образом:
public class WebForm1 : System.Web.UI.Page {
...
protected System.Data.DataSet ds;
protected System.Data.DataTable eventTable;
protected System.DataOleDb.OleDbDataAdapter daAttendees;
protected System.DataOleDb.OleDbDataAdapter daRooms;
protected System.Data.OleDb.OleDbDataAdapter daEvents;
Существуют версии SQL Server всех объектов OLE DB, и их использование идентично.
Теперь для Page_Load() надо создать объект DataSet:
private void Page_Load(object sender, System.EventArgs e) {
...
oleDbConnection1.Open();
ds = new DataSet();
Затем мы должны присвоить объектам OleDbDataAdapter запросы и соединить их с объектом соединения:
ds = new DataSet();
daAttendees =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Attendees", oleDbConnection1);
daRooms =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Rooms", oleDbConnection1);
daEvents =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events", oleDbConnection1);
Затем мы выполняем запросы с помощью вызовов Fill():
daEvents =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events", oleDbConnection1);
daAttendees.Fill(ds, "Attendees");
daRooms.Fill(ds, "Rooms");
daEvents.Fill(ds, "Events");
Теперь переходим непосредственно к самому соединению данных. Как упоминалось ранее, это несложно и включает задание для свойства DataSource элементов управления соединением таблиц, с которыми мы хотим соединиться:
daEvent s.Fill(ds, "Events");
attendeeList.DataSource = ds.Tables["Attendees"];
roomList.DataSource = ds.Tables["Rooms"];
Этот код задает свойства, но само соединение данных не произойдет, пока не будет вызван метод формы DataBind(), что мы сейчас и сделаем. Но прежде чем это сделать, заполним объект DataTable данными таблицы событий:
roomList.DataSource = ds.Tables["Rooms"];
eventTable = ds.Tables["Events"];
Будем соединять данные только в том случае, если нет обратной отправки, иначе происходит просто обновление данных (которые, по предположению, являются статическими в базе данных в течение выполнения запроса заказа события). Соединение данных при обратной отправке будет также стирать выбранные значения в элементах управления roomList и attendeeList. Мы могли бы сделать об этом замечание перед соединением, а затем обновить их, но проще вызвать DataBind() в существующем операторе if (причина, почему этот оператор содержался в области кода, где открыто соединение с данными):
eventTable = ds.Tables["Events"];
if (!this.IsPostBack) {
calendar.SelectedDate = System.DateTime.Now;
this.DataBind();
}
oleDbConnection1.Close();
}
Теперь выполнение приложения приведет к доступности всех данных о помещениях и приглашенных гостях из элементов управления соединением данных.
Модификация элемента управления календарем
Прежде чем обсуждать добавление событий к базе данных, давайте сделаем модификацию в выводе изображения календаря. Было бы неплохо выводить любой день, где была сделана предварительная заявка, другим цветом, и сделать такие дни недоступными для выбора. Это потребует модификации способа, которым даты задаются в календаре, и способа, которым выводятся ячейки дней.
Начнем с выбора даты. Существует три момента, когда нам необходимо проверять даты заявок на мероприятия и изменять соответственно сделанный выбор: когда мы задаем начальную дату в Page_Load(), когда пользователь пытается выбрать дату из календаря, и когда сделана заявка на мероприятие и мы хотим задать новую дату, чтобы помешать пользователю заказать подряд два мероприятия в один день до выбора новой даты. Так как это должно быть общим свойством, можно создать также скрытый метод для выполнения этого вычисления. Этот метод должен принимать пробную дату в качестве параметра и возвращать дату для использования, которая будет либо той же датой, что и пробная, или следующим доступным днем после пробной даты.
Код, который это делает, getFreeDate(), показан ниже:
private System.DateTime getFreeDate(System.DateTime trialDate) {
if (eventTable.Rows.Count > 0) {
System.DateTime=testDate;
bool trialDateOK = false;
while (!trialDateOK) {
trialDateOK = true;
foreach (System.Data.DataRow testRow in eventTable.Rows) {
testDate = (System.DateTime)TestRow["EventDate"];
if (testDate.Date == trialDate.Date) {
trialDateOK = false;
trialDate = trialDate.AddDays(1);
}
}
}
}
return trialDate;
}
Этот простой код использует объект eventTable, который заполняется в Page_Load(), для извлечения данных о мероприятии. Сначала мы проверяем тривиальный случай, где не заказано никаких мероприятий, в этом случае мы можем просто подтвердить пробную дату, возвращая ее. Затем мы просматриваем даты в таблице Event, сравнивая их с пробной датой. Если мы находим совпадение, то добавляем один день к пробной дате и снова выполняем поиск.
Извлечение даты из DataTable удивительно просто:
testDate = (System.DateTime)testRow["EventDate"];
Преобразование данных столбца в System.DateTime работает прекрасно.
Итак, прежде всего используем getFreeDate() в Page_Load(). Это просто означает внесение небольшого изменения в код, который задает свойство календаря SelectedDate:
if (!this.IsPostBack) {
System.DateTime trialDate = System.DateTime.Now;
calendar.SelectedDate = getFreeDate(trialDate);
this.DataBind();
}
Затем нам нужно ответить на выбор даты в календаре. Чтобы сделать это, просто добавим обработчик событий для события календаря SelectionChanged и выполним сравнение даты с датами существующих мероприятий:
protected void calendar_SelectionChanged(object sender, System.EventArgs e) {
System.DateTime trialDate = calendar.SelectedDate;
calendar.SelectedDate = getFreeDate(trialDate);
}
Этот код идентичен коду в Page_Load().
Третий момент, когда необходимо выполнить эту проверку, возникает при нажатии кнопки заказа. Мы вернемся к этому немного позже, так как мы должны внести несколько изменений.
Затем мы хотим изменить цвет ячейки дня календаря, чтобы обозначить существующие мероприятия. Чтобы сделать это, необходимо добавить обработчик событий для события DayRender объекта календаря. Это событие происходит всякий раз при изображении отдельного дня и предоставляет нам доступ к объекту выводимой ячейки и дате этой ячейки с помощью свойств Cell и Date параметра DayRenderEventArgs функции обработчика. Нам нужно просто сравнить дату изображаемой ячейки с датами в объекте eventTable и покрасить ячейку с помощью свойства Cell.BackColor, если существует совпадение:
protected void calendar_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e) {
if (eventTable.Rows.Count > 0) {
System.DateTime testDate;
fоreach (System.Data.DataRow testRow in eventTable.Rows) {
testDate = (System.DateTime)testRow["EventDate"];
if (testDate.Date == e.Day.Date) {
e.Cell.BackColor = Color.Red;
}
}
}
}
В данном случае используется красный цвет, который дает нам следующее изображение:
Здесь 15, 27, 28, 29 и 30 марта содержат мероприятия, а пользователь выбирает 17 марта. Теперь, после добавления логики выбора даты, невозможно выбрать день, который показан красным цветом, и если делается такая попытка, то вместо этого будет выбрана следующая дата. Например, щелчок на 28 марта в показанном выше календаре приведет к выбору 31 марта.
Запись мероприятий в базу данных
Обработчик событий submitButton_Click() в настоящее время собирает строку из характеристик мероприятия и выводит ее в элементе управления resultLabel. Чтобы добавить мероприятие в базу данных, нужно реформатировать созданную строку в запрос SQL INSERT и выполнить его.