Государственное образовательное учреждение высшего профессионального образования Тюменской области «ТЮМЕНСКАЯ ГОСУДАРСТВЕННАЯ АКАДЕМИЯ МИРОВОЙ ЭКОНОМИКИ, УПРАВЛЕНИЯ И ПРАВА» Факультет управления Кафедра математики, информатики и естественных наук Курсовая работа на тему: «Windows Presentation Foundation» Выполнил: студент 471 гр. Куничник Д.С. Проверил: Захаров С.Д. Тюмень 2010 2 Введение ......................................................................................................................... 3 1. Основные понятия WPF. ........................................................................................ 5 1.1 Особенности платформы .NET ........................................................................... 5 1.2 Появление WPF .................................................. Error! Bookmark not defined. 1.3 WPF: высокоуровневый API ............................................................................... 7 1.4 Разработка с использованием WPF .................................................................... 8 2. Разработка WPF-приложения «Словарь» ............................................................... 9 2.1 Технические задачи .......................................................................................... 9 2.2 Создание дизайна ............................................................................................... 10 2.3 Создание базы данных и подключение к ней ................................................. 15 2.4 Кодовая реализация ........................................................................................... 17 Заключение................................................................................................................... 19 Список использованной литературы ......................................................................... 20 Приложение 1 .............................................................................................................. 21 Листинг Web-страницы Defulat.aspx ...................................................................... 21 Приложение 2 .............................................................................................................. 28 Листинг программы Default.aspx.cs ....................................................................... 28 3 Введение Несмотря на быстрое развитие Интернета и связанных с ним технологий, Web-приложения ещё долгое время не смогут вытеснить Windows-приложения из-за достаточно большого количества ограничений. Поэтому актуальность разработки Windows-приложений не вызывает вопросов. Microsoft не перестает выпускать всё новые и новые версии операционной системы и средств разработки для неё. Если когда-то создание калькулятора занимало многие часы, то с появлением Windows Forms, а затем и платформы .NET все изменилось. Несмотря на то что Windows Forms является зрелым и полнофункциональным инструментальным средством, оно жестко связано с основными конструктивными особенностями Windows, которые не меняются на протяжении последних десяти лет. Более того, Windows Forms основывается на интерфейсе Windows API при создании внешнего вида стандартных элементов пользовательского интерфейса, таких как кнопки, текстовые окна, флажки и т.п. Как результат, эти ингредиенты, по сути, не поддаются настройке. Например, чтобы создать элегантную кнопку, нужно построить специальный элемент управления и раскрасить каждую частицу кнопки (во всех ее разных состояниях) с помощью низкоуровневой модели рисования. Более того, обычные окна делятся на разные области, в каждой из которых имеются свои элементы управления. В результате нет хорошего способа рисования в отдельном элементе управления (например, эффекта свечения ниже кнопки), чтобы при этом не затронуть областей, которыми владеют другие элементы. И даже не думайте об анимационных эффектах, таких как вращающийся текст, мерцающие окна или живые окна предварительного просмотра, поскольку вам придется рисовать каждую деталь вручную. Все поменялось благодаря новой модели с совершенно другой структурой, которую предлагает Windows Presentation Foundation (WPF). Несмотря на то, что WPF включает уже знакомые стандартные элементы управления, она сама 4 рисует каждый текст, рамку и фон. Как результат, WPF может предложить гораздо больше мощных функций. Итак, Объект курсовой работы: Windows Presentation Foundation. Предмет работы: разработка Windows-приложений. Цель: разработать Windows-приложение, основанный на технологии WPF Задачи, решение которых необходимо для достижения поставленной цели: 1. Рассмотреть платформу .NET. 2. Изучить основы .NET. 3. Изучить основы WPF. 4. Разработать приложение «Словарь», использующее возможности WPF. Актуальность данной работы заключается в том, что Windows является самой распространенной операционной системой и рынок Windows-приложений остается перспективным. 5 1. Основные понятия WPF. 1.1 Особенности платформы .NET WPF входит в состав платформы .NET, поэтому описание стоит начать именно с неё. Корпорацией Microsoft предложен новаторский компонентно- ориентированный подход к программированию, который является развитием объектно-ориентированного направления. Согласно этому подходу, интеграцияобъектов (возможно, гетерогенной природы) производится на основе интерфейсов, представляющих эти объекты (или фрагменты программ) как независимые компоненты. Такой подход существенно облегчает написание и взаимодействие программных компонент в среде проектирования и реализации. Стандартизируется хранение и повторное использование компонент программного проекта в условиях распределенной сетевой среды вычислений, где различные компьютеры и пользователи обмениваются информацией, например, взаимодействуя в рамках исследовательского или бизнес-проекта. Существенным преимуществом следует считать и возможность практической реализации принципа "всякая сущность является объектом" в гетерогенной программной среде. Во многом это стало возможным благодаря усовершенствованной, обобщенной системе типизации Common Type System, или CTS, которая будет подробнее рассмотрена в одной из следующих лекций. Строгая иерархичность организации пространств для типов, классов и имен сущностей программы позволяет стандартизировать и унифицировать реализацию. Новый подход к интеграции компонент приложений в среде вычислений Internet (или так называемые веб-сервисы) дает возможность ускоренного создания приложений для широкого круга пользователей. Универсальный интерфейс .NET проектирование и Framework обеспечивает реализациюкомпонентов приложений, согласно различным подходам к программированию. интегрированное разработанных 6 Говоря о .NET как о технологической платформе, нельзя не отметить тот факт, что она обеспечивает одновременную поддержку проектирования и реализации программного обеспечения с использованием различных языков программирования. При этом поддерживаются десятки языков программирования, начиная от самых первых (в частности, COBOL и FORTRAN) и заканчивая современными (например, C# и Visual Basic). Ранние языки программирования до сих пор активно используются, в частности, для обеспечения совместимости с ранее созданными приложениями, критичными для бизнеса. 7 1.3 WPF: высокоуровневый API Если бы единственным достоинством WPF было аппаратное ускорение через DirectX, это уже было бы значительным усовершенствованием, хотя и не революционным. Однако WPF на самом деле включает целый набор высокоуровневых служб, ориентированных на прикладных программистов. Ниже приведен список некоторых наиболее существенных изменений, которые принес с собой WPF в мир программирования Windows: Web-подобная модель компоновки. Вместо того чтобы фиксировать элементы управления на месте с определенными координатами. WPF поддерживает гибкий поток, размещающий элементы управления на основе их содержимого. В результате получается пользовательский интерфейс, который может быть адаптирован для отображения высокодинамичного содержимого или разных языков. Богатая модель рисования. Вместо рисования пикселей в WPF мы имеем дело с примитивами— базовыми фигурами, блоками текста и прочими графическими ингредиентами. Также имеются такие новые средства, как действительно прозрачные элементы управления, возможность складывать множество уровней с разной степенью прозрачности, а также встроенную поддержку трехмерной графики. Богатая текстовая модель Анимация как первоклассная программная концепция. Можно использовать таймер для того, чтобы заставить форму перерисовать себя. Но в WPF анимация — неотъемлемая часть программного каркаса. Анимация определяется декларативно. Поддержка аудио и видео. WPF включает поддержку воспроизведения любого аудио- или видеофайла, поддерживаемого Windows Media Player, позволяя воспроизводить более одного медиафайла одновременно. Стили и шаблоны. 8 1.4 Разработка с использованием WPF Разумеется, XAML можно писать вручную, но это достаточно сложно, поэтому в большинстве случаев дизайнеры пользуются Expression Blend и только в случае необходимости нестандартных решений, добавляют код вручную. Если открыть Visual Studio и создать новое WPF приложение, то будет автоматически сгенерирован код, включающий всего два элемента: окно Window и поле Grid («решетка»), на который можно поместить элементы управления. При этом может существовать только один элемент верхнего уровня. И каждый элемент является контейнером. Таким образом, образуется иерархия. (Рис.1) Рис. 1 Внутри дескрипторов помещаются атрибуты и свойства, такие как имя класса, стартовые высота и ширина. Стоит отметить, что 300 единиц обозначают специальную единицу измерения, которая представляет собой 1\96 дюйма экрана. Таким образом решается проблема с различными разрешениями и форматами и приложение будет адекватно работать практически при любых условиях. В связи с особенностями оформления XAML кода, некоторые символы (при написании кода вручную) нужно заменять на специальные коды, аналогичные кодам в HTML. Например, если мы попытаемся задать кнопке текст «<Click me>», то компилятор будет думать, что мы создаем объект «Click» с свойством me. То есть, вместо «<» нужно использовать «&lt;» и т.д. 9 2. Разработка WPF-приложения «Словарь» 2.1 Технические задачи 1. Разработать дизайн приложения. 2. Реализовать озвучку слов. 3. Создать подключение к базе данных на основе ADO.NET. 4. Осуществить: создание словарной базы данных наполнение базы данных; поиск по базе данных; интерактивный дизайн; анимацию части действий; реализовать прозрачность окна и элементов словаря; использование drag and drop; реализовать озвучку слов как встроенным синтезатором, так и воспроизведением из базы данных. 5. Провести тестирование и исправление обнаруженных ошибок. 10 2.2 Создание дизайна В качестве средства разработки внешнего вида приложения будет использоваться Microsoft Expression Blend 3. Основная идея приложения – в удобстве. Во-первых, когда на окно приложения не будет наведен курсов, оно должно будет уменьшаться до маленького квадрата, не закрывающего рабочую область пользователя. Во-вторых, будет достаточно высокая степень прозрачности, что также сделает пользование словарем при чтении текстов удобным. В-третьих, окно должно будет всегда в режиме «Always on top» пользователю не придется постоянно сворачивать и разворачивать окна. Первое, что нужно сделать – создать WPF проект. Для этого нужно нажать на Project-New project (Рис.2). Рис. 2 Далее, появится окно ввода названия проекта. Назовем его «Dictionary», выберем «WPF Application», язык – C# и нажмем «Ok». (Рис.3) Выделим основное окно и изменим его размер,- ширина будет равняться 368 единицам измерения и высота – 364. Как уже отмечалось ранее, единицы измерения показывают размер экрана, а не количество точек, выбранный размер окна будет заметно больше размера рабочей области. Это было сделано для создания небольшой дополнительной прозрачной зоны вокруг самого словаря, которая будет отслеживать движения курсора мыши. Поменяем цвет фона и границ фона. Выберем для Background и Border Brush любой цвет и поменяем Alpha (прозрачность) на 0. Также нужно нажать «Allow Transparency». Далее,- изменить Opacity до 94%. (Рис.4) 11 Рис. 4 Далее мы будем создавать зону отображения. Для этого выберем LayoutRoot и поменяем его свойства. Во-первых перетащим его мышкой в середину и поставим «замки» по правому нижниму углу. Выберем ширину равной 247, и высоту равной 324. Начнем создание элементов управления. По задумке, неактивное окно будет свернуто до небольшой полупрозрачной кнопки. Для этого из вкладки Assets перетащим элемент управления Button. Внешний вид кнопки не соответствует желаемому, поэтому нажмем правой кнопкой мыши и выберем «Edit template», в результате чего будет создано копия кнопки. Удалим из неё все объекты кроме корневого LayoutRoot. Добавим Rectangle (прямоугольник), выберем салатовый цвет и Opacity равной 71%. Создадим ещё один Rectangle, зададим ему белый цвет, Opacity на уровне 20%, RadiusX и RadiusY равными 1.75 – что создаст белый, едва заметный прямоугольник с закругленными углами, имитирующий отливание света от большого зеленого прямоугольника. Последнее, что нужно для нашей кнопки – красивая буква «D», - поместим TextBox, выберем шрифт Cruiz MT и размер 24 pt. В результате получится красивый элемент управления, показанный на рисунке 5. Рис. 5 Для предания большей интерактивности, можно встроить анимацию, которая будет воспроизводиться при наведении мыши. Для этого нажмем F6, что переведет Blend в режим «Анимация». Создадим новый триггер, который будет запускаться при наведении мыши – MouseEnter и добавим к нему анимацию. Для этого выделим букву D, добавим кадр на 0.5 секунде анимации и изменим цвет на белый. Добавим ещё один кадр на 1 секунде и поменяем цвет обратно на черный. Создадим ещё один триггер – MouseLeave, в списке выберем созданную анимацию и действие – «Remove» (Рис. 6). Таким образом, кнопка получила законченный вид: при наведении курсора будет включаться анимация в виде мерцающий буквы D. 12 Рис. 6. Аналогично создадим ещё одну кнопку, которая будет запускать озвучивание просматриваемого слова. Также будет запускаться анимация при наведении курсора. (Рис.7) Рис. 7 Теперь добавим TextBox, ListBox, RichTextBox, которые будут использованы соответственно для ввода нужного слова; вывода списка слов, начинающихся на введенное; и отображение словарной статьи. (Рис.8) На этом создание внешнего вида приложения закончено. 13 сайта используется Visual Web Developer 2008 (Express Edition). Создаем новый проект, для этого находим пункт меню File/New Web Site. В появившемся окне New Web Site выбираем ASP.NET Web Site. Далее определяем путь, где будет храниться наш сайт, а также язык программирования – Visual C# и нажимаем Ok. (Рис.1) Рис.1 Теперь можно приступить к разработке Web-дизайна. Нажимаем кнопку Split для того, чтобы разделить экран на две части и видеть как код сайта, так и его внешний вид (используем концепцию WYSIWYG). В результате мы увидим следующее (Рис.2): Рис.2 Для создания каркаса сайта мы будем использовать стандартные HTML таблицы. Чтобы её добавить, можно как написать соответствующий HTML-код вручную в верхней части (Source), так и вставить её из панели инструментов Toolbox используя Design. Мы воспользуемся вторым способом. (Рис.3) Рис.3 Далее мы редактируем таблицу так, как если бы мы работали с таблицами в Microsoft Word. Удаляем третью лишнюю строку, выделив её и нажав Del. Объединяем две первых ячейки верхней строки: выделяем их, нажимаем на них 14 правой кнопкой мыши и выбираем Modify\Merge Cells. В результате у нас получится следующее: (Рис.4) Рис.4 Настраиваем размеры и цвета каждой отдельной ячейки используя CSS (каскадные таблицы стиля). Для этого находим нужную нам ячейку, в панели Properties выбираем Style и нажимаем на троеточие, справа от этого свойства. (Рис.5) Рис.5 В появившемся далее окне выбираем нужные нам атрибуты для каждой из ячеек. Так у самой первой ячейки выбираем шрифт Verdana, размер 16pt. Для всей верхней строки таблицы определяем цвет #00ccff, высота – 22px, вертикальное выравненивание – middle. Для ячеек нижней строки определяем вертикальное выравнивание top, ширина ячеек – 20%, 60%, 20% соответственно. (Рис.6) Рис.6 В результате, у нас получится следующее. (Рис.7): Рис.7 Теперь осталось добавить компоненты WebPartManager and WebPartZone, позволяющие делать интерфейс сайта настраиваемым (наподобие сайта www.msn.com). Сначала нужно добавить компонент WebPartManager, который будет работать со всеми зонами сайта. Он также управляет персонализацией страницы. 15 Чтобы его добавить, нужно в любом месте внутри тега <form> написать <asp:WebPartManager runat="server" ID="MyPartManager" />. Теперь нужно добавить Web-part зоны в соответствующие ячейки. Можно воспользоваться панелью Toolbox (Рис.8), либо вставлять их вручную. Рис.8 Так в левую нижнюю ячейку таблицы мы вставляем компонент CatalogZone, который будет отображать все доступные в данный момент зоны. В среднюю и правую зоны вставляем простые объекты WebPartZone. (Рис.9) Рис.9 Зоны являются простыми контейнерами, а значит с ними можно работать также, как и с ячейками таблицы. Следующим элементом дизайна будет являться календарь. (Рис.10) Рис.10 Простым перетаскиванием добавляем его в правую зону (HelpZone). 2.3 Создание базы данных и подключение к ней Для работы с базой данных мы будем использовать Microsoft SQL Server. Так, как сайт находится на локальной машине, выберем Database File. В качестве имени используем MYDATABASE.MDF. (Рис.11) Рис.11 При помощи встроенного в IDE редактора баз данных создадим простую таблицу groupmates и наполним начальными данными. Столбцам year и phone разрешим оставаться пустыми (Allow Nulls). (Рис.12) Рис.12 16 Теперь из окна DataBase Explorer перетаскиваем таблицу groupmates на зону MainZone. (Рис.13) Visual Web Developer автоматически создаст объект SqlDataSource, сгенерирует нужную строку подключения и строку команд. Он также автоматически создаст экземпляр компонента GridView и привяжет его к SqlDataSource. Но в версии без SP1 есть баг, который заключается в неправильном привязывании GridView к SqlDataSource. Чтобы заставить приложение работать, нужно вырезать отвечающую за SqlDataSource часть кода и вставить её в конец страницы. Рис.13 Для реализации возможности добавления, изменения и удаления данных в среднюю зону добавим компонент ListView. Для автоматической настройки компонента, нажмем Configure Data Source. Нажимаем Next и в уже знакомом нам окне находим кнопку Advanced, поставим галочку у первого поля выбора. (Рис.14) Рис.14 В левую зону вставляем объект PageCatalogPart. Для каждой из зон делаем автоформатирование. Для этого нужно выбрать зону и справа от неё появится так называемый умный тэг. (Рис.15) Рис.15 Теперь наша страница уже начинает напоминать www.msn.com (Рис.16). Добавим ещё одну строку таблицы в конце, она будет играть роль footer’а и содержать лишь одну ячейку. Кроме того, в левую нижнюю ячейку нужно вставить объект EditorZone, который дает ещё большую гибкость настройки. Последнее, что стоит сделать – это добавить компонент Menu во вторую ячейку первой строки таблицы и OnMenuItemClick="PartsMenu_MenuItemClick". Рис.16 добавить обработчик 17 2.4 Кодовая реализация Начнем с реализации конвертера. Для этого в правую зону напишем следующий код: Теперь перейдем непосредственно к реализации алгоритма конвертации валют. Для этого два раза кликаем на кнопку Button1 и Visual Web Developer направит нас на метод-обработчик события Button_Click1. Внутри него мы пишем следующий код: Так как пользователь может ввести практически любые данные в текстовое поле, я использовал конструкцию try...catch. В случае каких-либо ошибок (например, ввода букв или слишком большого числа) метод выведет ошибку в окне, но не остановит работу приложения. Курсы валют я записал непосредственно в список опций компонента DropDownList. Это значит, что к ним можно обратиться просто использовав свойство Value, которое возвращает текстовые данные. Но нам нужно перемножить числа. Поэтому была использована функция Parse класса Decimal Созданное нами в верхней правой ячейке таблицы меню является пустым. Нам нужно наполнить его имеющимися опциями выбора отображения содержимого Web-зон. Для этого добавим следующий код в обработчик события Page_Load: Мы проверяем, первый ли раз была запрошена эта страница при помощи свойства IsPostBack. Иначе при каждом обновлении страницы пункты меню добавлялись бы снова и снова. Также отображение в стиле «Connect» не будет работать на локальной машине, поэтому на этапе создания опций выбора мы исключили его из списка. 18 В качестве отображения по-умолчанию был выбран тип «Edit». Он дает возможность увидеть все возможности сайта. В созданный ранее обработчик событий PartsMenu_MenuItemClick добавим следующий код: Чтобы названия каждой части сайта соответствовали содержанию, а не несло пустые названия вроде Untitled[x], в Page_Load также стоит дописать: Для реализации возможности динамической загрузки данных из файла также воспользуемся обработчиком события Page_Load. Но перед этим нужно добавить атрибуты для ячейки, содержимое которой будет динамически создаваться: Атрибут runat=”server” прверащает ячейку в HTML server control, а атрибут ID=”Header” дает ей имя. Это позволит работать с сайтом в привычной объектно-ориентированной среде. Теперь, чтобы реализовать динамическую загрузку мы снова добавим код в обработчик события Page_Load: В переменную типа String мы записываем физический путь сайта, который можно получить, использовав метод MapPath объекта Page. Далее при помощи потока мы открываем имеющийся файл и записываем все его содержимое в контейнер Header,- верхнюю левую ячейку страницы. 19 Заключение В процессе выполнения данной курсовой работы поставленные задачи и цель были выполнены. Представлены общие сведения о технологии ASP.NET. В первой главе были рассмотрены основные понятия разработки, сущность и организация ASP.NET. Также были рассмотрены все основные технологии разработки и основные отличительные особенности ASP.NET от них. Был проведен сравнительный анализ современной ASP.NET с её предшественниками. Найдены основные предпосылки появления и история данной технологии. Достаточно подробно был изучен алгоритм разработки Web-сайтов, а также рассмотрены модели использования HTML server controls и Web controls. Во второй главе курсовой работы были реализованы все поставленные технические задачи. Было осуществлено создание каркаса и дизайна сайта в соответствие со стандартом XHTML. Было осуществлено подключение к базе данных посредством Microsoft SQL Server Database File, сгенерирован не только Select, но и Update, Insert и Delete queries. Web-сайт «471 группа» позволяет добавлять и удалять информацию об учащихся, изменять данные и сохранять все произведенные изменения при помощи двух интерфейсов. Также был разработан модуль конвертера валют. Использовалась технология Web-parts, позволяющая динамически менять расположение блоков сайта. Для демонстрации возможность динамической загрузки данных, была реализована динамическая загрузка данных контейнера Header из файла. 20 Список использованной литературы 1. Карли Ватсон – С#, Издательство "Лори", Москва, 2005. 2. Вильямс - Microsoft ASP.NET 2.0 с примерами на C# 2005 для профессионалов, Москва, 2006. 3. Matthew MacDonald - Beginning ASP.NET 3.5 in C# 2008: From Novice to Professional, Second Edition, 2007 4. Matthew MacDonald and Mario Szpuszta - Pro ASP.NET 3.5 in C# 2008, Second Edition, 2007 5. http://wikipedia.org – электронный ресурс. 6. http://www.citforum.ru – электронный ресурс. 7. http://www.intuit.ru – электронный ресурс. 8. http://www.codenet.ru – электронный ресурс. 9. http://www.microsoft.com – электронный ресурс. 10.http://www.asp.net – электронный ресурс. 21 Приложение 1 Листинг Web-страницы Defulat.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>471 группа</title> </head> <body> <form id="form1" runat="server"> <div> <asp:WebPartManager runat="server" ID="MyPartManager" /> <table style="width: 80%; text-align:justify;"> <tr valign="middle" style="background: #00ccff"> <td colspan="2" runat="server" id="Header"> &nbsp;</td> <td style="height: 22px"> <asp:Menu ID="PartsMenu" runat="server" OnMenuItemClick="PartsMenu_MenuItemClick"> </asp:Menu> </td> </tr> <tr valign="top"> <td style="width: 20%"> <asp:CatalogZone ID="SimpleCatalog" runat="server" BackColor="#F7F6F3" BorderColor="#CCCCCC" BorderWidth="1px" FontNames="Verdana" Padding="6" HeaderText="Выбор"> <HeaderVerbStyle Font-Bold="False" Font-Size="0.8em" Font-Underline="False" ForeColor="#333333" /> <PartTitleStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.8em" ForeColor="White" /> <FooterStyle BackColor="#E2DED6" HorizontalAlign="Right" /> <PartChromeStyle BorderColor="#E2DED6" BorderStyle="Solid" BorderWidth="1px" /> <PartLinkStyle Font-Size="0.8em" /> <InstructionTextStyle Font-Size="0.8em" ForeColor="#333333" /> <ZoneTemplate> <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" Title="Части" /> </ZoneTemplate> <LabelStyle Font-Size="0.8em" ForeColor="#333333" /> 22 <SelectedPartLinkStyle Font-Size="0.8em" /> <VerbStyle Font-Names="Verdana" Font-Size="0.8em" ForeColor="#333333" /> <HeaderStyle BackColor="#E2DED6" Font-Bold="True" FontSize="0.8em" ForeColor="#333333" /> <EditUIStyle Font-Names="Verdana" Font-Size="0.8em" ForeColor="#333333" /> <PartStyle BorderColor="#F7F6F3" BorderWidth="5px" /> <EmptyZoneTextStyle Font-Size="0.8em" ForeColor="#333333" /> </asp:CatalogZone> <br /> <asp:EditorZone runat="server" ID="SimpleEditor" BackColor="#F7F6F3" BorderColor="#CCCCCC" BorderWidth="1px" FontNames="Verdana" Padding="6"> <FooterStyle BackColor="#E2DED6" HorizontalAlign="Right" /> <PartTitleStyle Font-Bold="True" Font-Size="0.8em" ForeColor="#333333" /> <PartChromeStyle BorderColor="#E2DED6" BorderStyle="Solid" BorderWidth="1px" /> <PartStyle BorderColor="#F7F6F3" BorderWidth="5px" /> <LabelStyle Font-Size="0.8em" ForeColor="#333333" /> <VerbStyle Font-Names="Verdana" Font-Size="0.8em" ForeColor="#333333" /> <ErrorStyle Font-Size="0.8em" /> <EmptyZoneTextStyle Font-Size="0.8em" ForeColor="#333333" /> <ZoneTemplate> <asp:PropertyGridEditorPart ID="MyPropertyEditor" runat="server" /> <asp:AppearanceEditorPart ID="MyMainEditor" runat="server" /> </ZoneTemplate> <EditUIStyle Font-Names="Verdana" Font-Size="0.8em" ForeColor="#333333" /> <HeaderStyle BackColor="#E2DED6" Font-Bold="True" FontSize="0.8em" ForeColor="#333333" /> <HeaderVerbStyle Font-Bold="False" Font-Size="0.8em" Font-Underline="False" ForeColor="#333333" /> <InstructionTextStyle Font-Size="0.8em" ForeColor="#333333" /> </asp:EditorZone> </td> <td style="width: 60%"> <asp:WebPartZone ID="MainZone" runat="server" Height="161px" Width="357px" BorderColor="#CCCCCC" Font-Names="Verdana" Padding="6" HeaderText="Средняя зона" EmptyZoneText="Добавьте сюда модули"> <EmptyZoneTextStyle Font-Size="0.8em" /> <PartStyle Font-Size="0.8em" ForeColor="#333333" /> <TitleBarVerbStyle Font-Size="0.6em" FontUnderline="False" ForeColor="White" /> <MenuLabelHoverStyle ForeColor="#E2DED6" /> <MenuPopupStyle BackColor="#5D7B9D" BorderColor="#CCCCCC" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.6em" /> <MenuVerbStyle BorderColor="#5D7B9D" BorderStyle="Solid" BorderWidth="1px" ForeColor="White" /> 23 <PartTitleStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.8em" ForeColor="White" /> <ZoneTemplate> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" EmptyDataText="Нет данных" Caption="471 группа" RowHeaderColumn="name"> <Columns> <asp:BoundField DataField="name" HeaderText="Имя" SortExpression="name" /> <asp:BoundField DataField="surname" HeaderText="Фамилия" SortExpression="surname" /> <asp:BoundField DataField="year" HeaderText="Год рождения" SortExpression="year" /> <asp:BoundField DataField="phone" HeaderText="Телефон" SortExpression="phone" /> </Columns> </asp:GridView> <asp:ListView ID="ListView1" runat="server" DataKeyNames="num" DataSourceID="SqlDataSource1" InsertItemPosition="LastItem"> <AlternatingItemTemplate> <li style="background-color: #FFF8DC;">num: <asp:Label ID="numLabel" runat="server" Text='<%# Eval("num") %>' /> <br /> Имя: <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /> <br /> Фамилия: <asp:Label ID="surnameLabel" runat="server" Text='<%# Eval("surname") %>' /> <br /> Телефон: <asp:Label ID="phoneLabel" runat="server" Text='<%# Eval("phone") %>' /> <br /> Год рождения: <asp:Label ID="yearLabel" runat="server" Text='<%# Eval("year") %>' /> <br /> <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Редактировать" /> <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="Удалить" /> </li> </AlternatingItemTemplate> <LayoutTemplate> <ul ID="itemPlaceholderContainer" runat="server" style="font-family: Verdana, Arial, Helvetica, sans-serif;"> <li ID="itemPlaceholder" runat="server" /> </ul> <div style="text-align: center;backgroundcolor: #CCCCCC;font-family: Verdana, Arial, Helvetica, sans-serif;color: #000000;"> </div> 24 </LayoutTemplate> <InsertItemTemplate> <li style="">num: <asp:TextBox ID="numTextBox" runat="server" Text='<%# Bind("num") %>' /> <br /> Имя: <asp:TextBox ID="nameTextBox" runat="server" Text='<%# Bind("name") %>' /> <br /> Фамилия: <asp:TextBox ID="surnameTextBox" runat="server" Text='<%# Bind("surname") %>' /> <br /> Телефон: <asp:TextBox ID="phoneTextBox" runat="server" Text='<%# Bind("phone") %>' /> <br /> Год рождения: <asp:TextBox ID="yearTextBox" runat="server" Text='<%# Bind("year") %>' /> <br /> <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="Добавить" /> <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Очистить" /> </li> </InsertItemTemplate> <SelectedItemTemplate> <li style="background-color: #008A8C;fontweight: bold;color: #FFFFFF;">num: <asp:Label ID="numLabel" runat="server" Text='<%# Eval("num") %>' /> <br /> Имя: <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /> <br /> Фамилия: <asp:Label ID="surnameLabel" runat="server" Text='<%# Eval("surname") %>' /> <br /> Телефон: <asp:Label ID="phoneLabel" runat="server" Text='<%# Eval("phone") %>' /> <br /> Год: <asp:Label ID="yearLabel" runat="server" Text='<%# Eval("year") %>' /> <br /> <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Редактировать" /> <asp:Button ID="DeleteButton" runat="server" CommandName="Удалить" Text="Delete" /> </li> </SelectedItemTemplate> <EmptyDataTemplate> No data was returned. </EmptyDataTemplate> <EditItemTemplate> <li style="background-color: #008A8C;color: #FFFFFF;">num: 25 runat="server" runat="server" runat="server" runat="server" runat="server" runat="server" runat="server" <asp:Label ID="numLabel1" Text='<%# Eval("num") %>' /> <br /> Имя: <asp:TextBox ID="nameTextBox" Text='<%# Bind("name") %>' /> <br /> Фамилия: <asp:TextBox ID="surnameTextBox" Text='<%# Bind("surname") %>' /> <br /> Телефон: <asp:TextBox ID="phoneTextBox" Text='<%# Bind("phone") %>' /> <br /> Год рождения: <asp:TextBox ID="yearTextBox" Text='<%# Bind("year") %>' /> <br /> <asp:Button ID="UpdateButton" CommandName="Update" Text="Обновить" /> <asp:Button ID="CancelButton" CommandName="Cancel" Text="Отменить" /> </li> </EditItemTemplate> <ItemTemplate> <li style="background-color: #DCDCDC;color: #000000;">num: <asp:Label ID="numLabel" runat="server" Text='<%# Eval("num") %>' /> <br /> Имя: <asp:Label ID="nameLabel" runat="server" Text='<%# Eval("name") %>' /> <br /> Фамилия: <asp:Label ID="surnameLabel" runat="server" Text='<%# Eval("surname") %>' /> <br /> Телефон: <asp:Label ID="phoneLabel" runat="server" Text='<%# Eval("phone") %>' /> <br /> Год рождения: <asp:Label ID="yearLabel" runat="server" Text='<%# Eval("year") %>' /> <br /> <asp:Button ID="EditButton" runat="server" CommandName="Edit" Text="Редактировать" /> <asp:Button ID="DeleteButton" runat="server" CommandName="Delete" Text="Удалить" /> </li> </ItemTemplate> <ItemSeparatorTemplate> <br /> </ItemSeparatorTemplate> </asp:ListView> </ZoneTemplate> 26 <MenuVerbHoverStyle BackColor="#F7F6F3" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" ForeColor="#333333" /> <PartChromeStyle BackColor="#F7F6F3" BorderColor="#E2DED6" Font-Names="Verdana" ForeColor="White" /> <HeaderStyle Font-Size="0.7em" ForeColor="#CCCCCC" HorizontalAlign="Center" /> <MenuLabelStyle ForeColor="White" /> </asp:WebPartZone> </td> <td style="width: 20%"> <asp:WebPartZone ID="HelpZone" runat="server" BorderColor="#CCCCCC" Font-Names="Verdana" Padding="6" HeaderText="Правая зона" EmptyZoneText="Добавьте сюда модули"> <EmptyZoneTextStyle Font-Size="0.8em" /> <PartStyle Font-Size="0.8em" ForeColor="#333333" /> <TitleBarVerbStyle Font-Size="0.6em" FontUnderline="False" ForeColor="White" /> <MenuLabelHoverStyle ForeColor="#E2DED6" /> <MenuPopupStyle BackColor="#5D7B9D" BorderColor="#CCCCCC" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.6em" /> <MenuVerbStyle BorderColor="#5D7B9D" BorderStyle="Solid" BorderWidth="1px" ForeColor="White" /> <PartTitleStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.8em" ForeColor="White" /> <ZoneTemplate> <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar> <asp:Panel ID="ConverterPanel" runat="server"> <asp:TextBox ID="TextBox1" runat="server" Width="94px"></asp:TextBox> <br /> <asp:DropDownList ID="DropDownList1" runat="server"> <asp:ListItem Value="42,5">Евро</asp:ListItem> <asp:ListItem Value="35,2">Доллар</asp:ListItem> <asp:ListItem Value="3,2">Гривна</asp:ListItem> </asp:DropDownList><br /> <asp:Button ID="Button1" runat="server" Text="Отправить" onclick="Button1_Click" /><br /> <asp:Label ID="Label1" runat="server"></asp:Label> </asp:Panel> </ZoneTemplate> <MenuVerbHoverStyle BackColor="#F7F6F3" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" ForeColor="#333333" /> 27 <PartChromeStyle BackColor="#F7F6F3" BorderColor="#E2DED6" Font-Names="Verdana" ForeColor="White" /> <HeaderStyle Font-Size="0.7em" ForeColor="#CCCCCC" HorizontalAlign="Center" /> <MenuLabelStyle ForeColor="White" /> </asp:WebPartZone> </td> </tr> <tr> <td colspan="3"> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDataBaseConnectionString2 %>" DeleteCommand="DELETE FROM [mygroupmates] WHERE [num] = @num" InsertCommand="INSERT INTO [mygroupmates] ([num], [surname], [name], [year], [phone]) VALUES (@num, @surname, @name, @year, @phone)" SelectCommand="SELECT [num], [surname], [name], [year], [phone] FROM [mygroupmates]" UpdateCommand="UPDATE [mygroupmates] SET [surname] = @surname, [name] = @name, [year] = @year, [phone] = @phone WHERE [num] = @num"> <DeleteParameters> <asp:Parameter Name="num" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="surname" Type="String" /> <asp:Parameter Name="name" Type="String" /> <asp:Parameter Name="year" Type="String" /> <asp:Parameter Name="phone" Type="String" /> <asp:Parameter Name="num" Type="Int32" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="num" Type="Int32" /> <asp:Parameter Name="surname" Type="String" /> <asp:Parameter Name="name" Type="String" /> <asp:Parameter Name="year" Type="String" /> <asp:Parameter Name="phone" Type="String" /> </InsertParameters> </asp:SqlDataSource> </td> </tr> </table> </div> </form> </body> </html> 28 Приложение 2 Листинг программы Default.aspx.cs using using using using using using using using using using using System; System.Configuration; System.Data; System.Linq; System.Web; System.Web.Security; System.Web.UI; System.Web.UI.HtmlControls; System.Web.UI.WebControls; System.Web.UI.WebControls.WebParts; System.Xml.Linq; public partial class _Default : System.Web.UI.Page { protected void PartsMenu_MenuItemClick(object sender, MenuEventArgs e) { try { if (e.Item.Text != null) { MyPartManager.DisplayMode = MyPartManager.DisplayModes[e.Item.Text]; } } catch { } } protected void Page_Load(object sender, EventArgs e) { string CurrentPath = Page.MapPath("header.txt"); System.IO.StreamReader myReader = new System.IO.StreamReader(CurrentPath); Header.InnerHtml = myReader.ReadToEnd(); MyPartManager.WebParts[0].Title MyPartManager.WebParts[1].Title MyPartManager.WebParts[2].Title MyPartManager.WebParts[3].Title = = = = "База Данных"; "База Данных С Добавлением"; "Календарь"; "Конвертер"; if (!this.IsPostBack) { MenuItem Root = new MenuItem("Выберите режим"); foreach (WebPartDisplayMode mode in MyPartManager.DisplayModes) 29 { if (mode.IsEnabled(MyPartManager) && (mode.Name!="Connect")) { Root.ChildItems.Add(new MenuItem(mode.Name)); } } PartsMenu.Items.Add(Root); MyPartManager.DisplayMode = MyPartManager.DisplayModes["Edit"]; } } protected void Button1_Click(object sender, EventArgs e) { try { Label1.Text = Convert.ToString(Decimal.Parse(TextBox1.Text) * Decimal.Parse(DropDownList1.SelectedItem.Value)); } catch { Label1.Text = "Ошибка"; TextBox1.Text = ""; } } }