c# web. Занятие 06

39
Темы лекции: ASP.NET. Web Forms. Часть 2. Практическое задание: ASP.NET. Web Forms. Тренер: Игорь Шкулипа, к.т.н. Разработка Веб-приложений на платформе Microsoft .NET Framework. Занятие 6

Upload: igor-shkulipa

Post on 21-Mar-2017

294 views

Category:

Education


1 download

TRANSCRIPT

Темы лекции: ASP.NET. Web Forms. Часть 2.

Практическое задание: ASP.NET. Web Forms.

Тренер: Игорь Шкулипа, к.т.н.

Разработка Веб-приложений на платформе Microsoft .NET Framework.

Занятие 6

http://www.slideshare.net/IgorShkulipa 2

Привязка данных

Привязка данных — это средство, которое позволяет ассоциироватьисточник данных с элементом управления с целью автоматическогоотображения данных в этом элементе управления. Ключевойхарактеристикой привязки данных являет ее декларативный, а непрограммный характер. Это значит, что привязка данныхопределена вне кода, наряду с элементами управления, на странице.aspx. Преимущество состоит в том, что такой подход позволяетдостичь более четкого разделения между элементами управления илогикой кода веб-страницы.

В ASP.NET большинство элементов управления (включая TextBox,LinkButton, Image и многие другие) поддерживают привязку данных содним значением (single-value). Такая привязка позволяет связатьсвойство элемента управления с источником данных, но элементуправления может отображать единственное значение. Привязываемоесвойство не обязательно должно отображать нечто видимое настранице. Например, можно не только привязать текст гиперссылки,установив свойство Hyperlink.Text, но также привязать свойствоNavigateUrl для указания целевого назначения ссылки. Дляиспользования привязки одного значения создаются выраженияпривязки данных.

http://www.slideshare.net/IgorShkulipa 3

Множественная привязка данных

Многие веб-элементы управления поддерживают привязку смногократными значениями (repeated-value), это значит, что онимогут отображать наборы элементов. Элементы управления смногократными значениями включают списки и экранные таблицы(двумя примерами могут служить ListBox и GridView).

Если элемент управления поддерживает такую привязку, он всегдапредоставляет свойство DataSource, которое принимает объектданных. (Обычно объекты данных являются некоторого родаколлекцией, а каждый элемент в коллекции представляет записьданных.)

http://www.slideshare.net/IgorShkulipa 4

Привязка с одним значением

Элементы управления, которые поддерживают привязку данных в режимеодного значения, позволяют привязать некоторые из их свойств квыражению привязки данных. Это выражение вводится в части .aspxразметки страницы и помещается между разделителями <%# и %>.

<%# выражение %>

Чтобы вычислить выражение привязки вроде этого, вы должны вызвать всвоем коде метод Page.DataBind(). При вызове этого метода ASP.NETпроверяет все выражения на странице и заменяет ихсоответствующими значениями.

Если вы забудете вызвать метод DataBind(), выражение привязки незаполнит элемент управления — вместо этого он простоотбрасывается во время преобразования страницы в HTML-разметку.

http://www.slideshare.net/IgorShkulipa 5

Привязка с одним значением

Источник для привязки с одним значением может включать значениесвойства, переменную-член или возвращаемое значение функции (дотех пор, пока свойство, переменная-член или функция имеют доступтипа protected, public или internal).

Это также может быть любое другое выражение, которое может бытьвычислено во время выполнения, такое как ссылка на свойстводругого элемента управления или результат вычисления сиспользованием литеральных значений и операций с ними и т.д.

<%# GetUserName(ID) %>

<%# 1 + (2 * 20) %>

<%# "John " + "Smith" %>

<%# Request.Browser.Browser %>

http://www.slideshare.net/IgorShkulipa 6

Привязка других данных

Можно не только привязать свойство Text элемента управления Label илиTextBox, но также использовать и другие свойства, подобныеImageUrl элемента управления Image, NavigateUrl элементауправления HyperLink и даже атрибуту src статического HTML-дескриптора <img>.

Можно также разместить выражение привязки в любом местестраницы, не привязывая его ни к какому свойству или атрибуту.

<asp:Image runat="server"

ImageUrl='<%# FilePath %>'

ID="Image1" />

http://www.slideshare.net/IgorShkulipa 7

Другие типы выражений

В ASP.NET также имеется поддержка различного типа выражений,которые в общем называются $-выражениями, поскольку включаютв себя символ $.

Формально $-выражение — это последовательность кода, которуюможно добавить на страницу .aspx и которая будет вычисленаконструктором выражений во время визуализации страницы.Конструктор выражений обрабатывает выражение и размещает его какстроковое значение в финальной HTML-разметке.

ASP.NET включает встроенный построитель выражений, который даетвозможность извлекать пользовательские параметры настройкиприложения и информацию строки соединения из файла web.config.

Например, для извлечения параметра настройки приложения по имениappName из раздела <appSettings> файла web.config можноиспользовать следующее выражение:

<asp:Literal Runat="server" Text="<%$ AppSettings:appName %>" />

http://www.slideshare.net/IgorShkulipa 8

Отличия $-выражений и выражений привязки данных

• Выражения привязки данных начинаются с последовательности символов<%#, а $-выражения — с <%$.

• В отличие от выражений привязки данных, вызывать метод DataBind()для вычисления $-выражений не нужно. Они всегда вычисляются приотображении страницы.

• В отличие от выражений привязки данных, $-выражения не могут бытьпомещены в любое место страницы. Вместо этого их следует поместить вдескриптор элемента управления и использовать результат выражения дляустановки какого-то свойства элемента управления.

•Первая часть $-выражения указывает имя построителя выражений. Например,выражение AppSettings:appName работает, потому что выделенныйпостроитель выражений AppSettingsExpressionBuilder зарегистрирован дляобработки выражений, которые начинаются с AppSettings. Аналогично,ASP.NET включает ResourceExpressionBuilder для вставки ресурсов иConnectionStringExpressionBuilder — для извлечения информации о соединениииз раздела <connectionStrings> файла web.config.

•Формально $-выражения не включают привязку данных, но работаютаналогично выражениям привязки и имеют похожий синтаксис.

http://www.slideshare.net/IgorShkulipa 9

Пользовательские построители выражений

Одним из самых инновационных средств $-выражений являетсявозможность создания собственных построителей выражений, которыеподключаются к этой платформе.

Например, предположим, что вы хотите создать собственный построительвыражений, который позволит вставлять случайные числа.Необходима возможность писать дескрипторы, вроде приведенногониже, чтобы отображать случайное число от 1 до 10:

<asp:Label ID="Label1" runat="server" Text="<%$ Random:1,10 %>" />

Все построители выражений должны наследоваться от базового классаExpressionBuilder (который находится в пространстве именSystem.Web.Compilation). Самый легкий способ создать простойпостроитель выражений состоит предусматривает сначала реализациюстатического метода, выполняющего нужную задачу. В данном случаестатический метод генерирует случайное число:

http://www.slideshare.net/IgorShkulipa 10

Пользовательские построители выражений

Все построители выражений должны наследоваться от базового классаExpressionBuilder (который находится в пространстве именSystem.Web.Compilation). Самый легкий способ создать простой построительвыражений состоит предусматривает реализацию статического метода,выполняющего нужную задачу.

public class RandomExpressionBuilder : ExpressionBuilder

После реализации всех необходимых методов, построитель выражений можноскопировать в папку App_Code (или компилировать его отдельно и поместитьDLL-файл сборки в папку Bin).

А, чтобы использовать этот построитель выражений в веб-приложении, понадобитсязарегистрировать его в файле web.config и отобразить на подходящий префикс:

<configuration>

<system.web>

<compilation debug="true">

<expressionBuilders>

<add expressionPrefix="Random”

type="RandomExpressionBuilder"/>

</expressionBuilders>

</compilation>

<!-- ... -->

</system.web>

</configuration>

http://www.slideshare.net/IgorShkulipa 11

Привязка с многократными значениями

ASP.NET включает несколько базовых списковых элементов управления,которые поддерживают привязку с многократными значениями:

• Все элементы управления, которые генерируют свой код сиспользованием дескриптора <select>, включая HtmlSelect, ListBox иDropDownList.

• Элементы управления CheckBoxList и RadioButtonList, генерирующиекаждый дочерний элемент в виде отдельного флажка илипереключателя.

• Элемент управления BulletedList, создающий список с метками илипронумерованными пунктами.

http://www.slideshare.net/IgorShkulipa 12

Свойства элементов с многократной привязкой

Свойство Описание

DataSource

Это объект данных, содержащий коллекцию элементов данных для

отображения. Должен реализовывать один из интерфейсов,

поддерживаемых привязкой данных ASP.NET, обычно ICollection

DataSourceID

Установив это свойство, вместо передачи объекта данных в коде можно

связать списковый элемент управления с элементом управления источником

данных. Элемент управления источником данных сгенерирует требуемый

объект данных автоматически. Использовать можно либо свойство

DataSource, либо DataSourceID, но не оба сразу

DataTextField

Каждый источник данных представляет коллекцию элементов данных.

Списковый элемент управления может отображать только одно значение из

каждого элемента списка. DataTextField указывает столбец (в случае строки

таблицы) или свойство (в случае объекта) элемента данных, которое

содержит значение, отображаемое на странице

DataTextFormatString

Это свойство указывает необязательную строку формата, которую будет

использовать элемент управления для форматирования каждого

DataTextField перед его отображением. Например, можно указать, что число

должно быть форматировано в виде денежного значения

DataValueField

Это свойство подобно DataTextField, но значение самого элемента данных

на странице не отображается. Вместо этого оно сохраняется в атрибуте

value лежащего в основе HTML-дескриптора. Это позволяет извлечь

значение позже в коде. Главное назначение этого поля — хранить

уникальный идентификатор или поле первичного ключа с тем, чтобы вы

могли использовать его позднее для извлечения остальных данных, когда

пользователь выберет конкретный элемент

http://www.slideshare.net/IgorShkulipa 13

Привязка к SqlDataSource

Элементы управления источниками данных включают любые элементыуправления, реализующие интерфейс IDataSource: SqlDataSource,

ObjectDataSource, XmlDataSource, SiteMapDataSource и

LinqDataSource.

Элемент SqlDataSource позволяет подключаться к любому источникуданных, который имеет поставщика данных ADO.NET. Сюда относятсяSQL Server, Oracle и OLE DB или ODBC. Используя этот элемент, писатькод доступа к данным не понадобится.

Элемент SqlDataSource может решать две основных задачи:

• извлекать данные из источника и применять к связаннымэлементам управления

• обновлять источник данных, когда в связанных элементахуправления выполняется редактирование

http://www.slideshare.net/IgorShkulipa 14

Жизнь страницы с SqlDataSource

• Создается объект страницы.

• Начинается жизненный цикл страницы, инициируются событияPage.Init и Page.Load.

• Происходят все остальные события элементов управления.

• Элементы управления источниками данных выполняют любыеобновления. Если обновляется строка, генерируются события Updatingи Updated. Если строка вставляется — то события Inserting и Inserted.Если строка удаляется — Deleting и Deleted.

• Генерируется событие Page.PreRender.

• Элементы управления источниками данных выполняют необходимыезапросы и вставляют полученные данные в связанные элементыуправления. Здесь генерируются события Selecting и Selected.

• Страница отображается и освобождается.

http://www.slideshare.net/IgorShkulipa 15

Привязка к SqlDataSource с одним значением

К сожалению, свойство DataTextField ожидает имя только одного поля.Однако эту проблему можно решить посредством простого, ноэффективного трюка — использования вычисляемого столбца.

Для этого понадобится просто модифицировать запрос SELECT так, чтобыон создавал вычисляемый столбец, содержащий информацию из этихдвух полей.

Затем этот столбец можно применять в DataTextField. Необходимаякоманда SQL выглядит следующим образом:

SELECT EmployeeID, FirstName + ' ' + LastName AS FullName FROM

Employees

http://www.slideshare.net/IgorShkulipa 16

Многофункциональные элементы управления данными

В дополнение к простым списковым элементам управления ASP.NET включает набормногофункциональных элементов управления данными для поддержки привязкис многократными значениями. К многофункциональным элементам управленияотносятся:

• GridView - табличный элемент управления общего назначения для отображениябольших таблиц информации. Поддерживает выбор, редактирование, сортировкуи перемещение по страницам. GridView — "тяжеловес" среди элементовуправления ASP.NET. Он является потомком DataGrid из ASP.NET 1.x.

• DetailsView - Идеальный выбор для показа одной записи за раз в таблице,имеющей одну строку на поле. DetailsView поддерживает редактирование инеобязательно возможность перемещения по страницам, что позволяетпросматривать последовательности записей.

• FormView - Как и DetailsView, элемент FormView отображает по одной записи зараз, поддерживает редактирование и предоставляет элементы управления дляперемещения по последовательности записей. Отличие состоит в том, чтоFormView основан на шаблонах, а это позволяет комбинировать поля гораздоболее гибким образом, не обязательно основанным на таблице.

В дополнение к перечисленным здесь элементам управления привязку данныхподдерживают еще некоторые более специализированные элементы управленияASP.NET. Сюда входят Menu, TreeView и AdRotator.

http://www.slideshare.net/IgorShkulipa 17

Кэширование

Кэширование - это технология хранения в памяти копии информации,которую дорого создавать повторно. Например, можно кэшироватьрезультаты сложного запроса, так что для повторного его выполнениявообще не потребуется обращаться к базе данных. Вместо этогосоответствующий объект будет извлечен непосредственно из памятисервера, что намного быстрее.

Изящество кэширования в том. что в отличие от многих других приемовповышения производительности, оно увеличивает какпроизводительность, так и масштабируемость. Производительностьрастет благодаря значительному снижению времени, необходимого наизвлечение информации. Масштабируемость же становится лучшеблагодаря тому, что обходятся узкие места — вроде соединений сбазой данных. В результате приложение может обслужить большезапросов страниц одновременно при меньшем количестве операций сбазой данных.

http://www.slideshare.net/IgorShkulipa 18

Кэширование

Среда ASP.NET поддерживает два типа кэширования. Ваши приложениямогут, да и должны, использовать оба типа, т.к. они дополняют другдруга:

• Кэширование выводаЭто простейший тип кэширования. При этом сохраняется копияокончательно сгенерированной HTML-страницы, отправленнойклиенту. Следующий клиент, который запросит эту же страницу, насамом деле не будет ожидать ее построения. Готовая HTML-разметкабудет отправлена ему автоматически. Время, необходимое навыполнение кода страницы, полностью экономится.

• Кэширование данныхЭтим кэшированием можно управлять вручную в коде. Чтобыиспользовать кэширование данных, вы сохраняете в кэше важныечасти информации, которые требуют значительного времени наповторную реконструкцию (например, объект DataSet, извлеченныйиз базы данных). Другие страницы могут проверить существованиеэтой информации и пользоваться ею — таким образом, пропускаяшаги, обычно подлежащие выполнению для ее получения.

http://www.slideshare.net/IgorShkulipa 19

Кэширование

На основе этих моделей построены также два специализированных типакэширования:

• Кэширование фрагментов.Это специализированный тип кэширования вывода — вместокэширования HTML-страниц целиком оно позволяет кэшировать HTML-разметку по частям. Этот механизм работает за счет сохраненияобработанного HTML-вывода для пользовательских элементовуправления на странице. В следующий раз, когда выполняется даннаястраница, генерируются те же события (и потому код страницы будетработать по-прежнему), но код соответствующих пользовательскихэлементов управления уже не выполняется.

• Кэширование источников данных.Это кэширование, встроенное в элементы управления источникамиданных, в том числе SqlDataSource, ObjectDataSource и XmlDataSource.Формально кэширование источников данных использует кэшированиеданных. Отличие в том, что управлять этим процессом явно неприходится. Вместо этого нужно просто сконфигурироватьсоответствующие свойства, и элемент управления источником данныхбудет управлять процессом сохранения и извлечения из кэша.

http://www.slideshare.net/IgorShkulipa 20

Кэширование вывода

При кэшировании вывода в памяти сохраняется окончательнаясгенерированная HTML-разметка страницы. Когда та же самаястраница запрашивается вновь, объекты элементов управления несоздаются заново, жизненный цикл страницы не запускается и ничегоиз вашего кода не выполняется. Вместо этого пользователюдоставляется кэшированная HTML-разметка. Ясно, что кэшированиевывода теоретически обеспечивает максимальный ростпроизводительности, поскольку исключаются все накладные расходы,связанные с выполнением кода.

Страница ASP.NET может использовать другие статические ресурсы (такиекак изображения), которые не обрабатываются ASP.NET. Небеспокойтесь об их кэшировании. Веб-сервер IIS автоматическиобрабатывает кэширование файлов наиболее эффективным извозможных способом.

Декларативное кэширование вывода

<%@ OutputCache Duration="20" VaryByParam="None" %>

http://www.slideshare.net/IgorShkulipa 21

Кэширование данных

Кэширование данных - наиболее гибкий тип кэширования, однако для своейреализации он требует выполнения в коде ряда дополнительных шагов.

Базовый принцип кэширования данных состоит в добавлении элементов,создание которых обходится дорого, в специальный встроенный объектколлекции (называемый Cache). Этот объект доступен глобально всемзапросам от всех клиентов в приложении.

• Объект Cache является безопасным в отношении потоков

• Элементы из кэша удаляются автоматически

• Элементы кэша поддерживают зависимости

Добавлять элемент в коллекцию Cache можно простым присваиваниемнового имени ключа:

Cache["key"] = item;

Однако такой подход обычно не применяется, потому что он не позволяетполучить контроль над временем нахождения объекта в кэше. Болеепредпочтительный подход заключается в применении метода Insert().

http://www.slideshare.net/IgorShkulipa 22

Cache.Insert()

Метод Описание

Cache.Insert(key, value)

Вставляет элемент в кэш под указанным ключевымименем, используя приоритет и время существованияпо умолчанию. Это эквивалентно применениюсинтаксиса коллекции на основе индекса иприсваиванию нового ключевого имени

Cache.Insert(key, value,

dependencies)

Вставляет элемент в кэш под указанным ключевымименем, используя приоритет и время существованияпо умолчанию. Последний параметр содержит объектCacheDependency, связанный с другими файлами иликэшируемыми элементами и позволяющий объявлятьданный элемент недействительным в случае ихизменения

Cache.Insert(key, value,

dependencies, absoluteExpiration,

slidingExpiration)

Вставляет элемент в кэш под указанным ключевымименем, используя приоритет и указанную политикуустаревания (одну из двух). Эта версия метода Insert()используется наиболее часто

Cache.Insert(key, value,

dependencies, absoluteExpiration,

slidingExpiration, priority,

onRemoveCallback)

Позволяет конфигурировать все аспекты политикикэширования элемента, включая время существования,зависимости и приоритет. Вдобавок можно передатьделегат, указывающий на метод, который должен бытьвызван при удалении элемента из кэша

http://www.slideshare.net/IgorShkulipa 23

Приоритеты кэширования. Перечисление CachePriority

Значение Описание

High

Эти элементы имеют минимальную вероятность удалений из кэша, когда сервер будет освобождать системную память

AboveNormalУдаление этих элементов менее вероятно, чем имеющих приоритет Normal

Normal

Эти элементы имеют уровень приоритета по умолчанию. Они могут быть удалены только после удаления элементов с приоритетами Low и BelowNormal

BelowNormalУдаление этих элементов более вероятно, чем элементов с приоритетом Normal

LowУдаление из кэша элементов с этим приоритетом наиболее вероятно при очистке системной памяти сервером

NotRemovableЭлементы с таким приоритетом обычно не удаляются из кэша при очистке системной памяти сервером

http://www.slideshare.net/IgorShkulipa 24

Свойства элементов управления источниками данных, связанные с кэшированием

Свойство Описание

EnableCachingЕсли равно true, то кэширование включено.Значением по умолчанию является false

CacheExpirationPolicy

Использует значения из перечисленияDataSourceCacheExpiry: Absolute - для абсолютногоустаревания (когда указывается фиксированноевремя нахождение объекта в кэше) или Sliding - дляскользящего устаревания (когда временное окносбрасывается при каждом извлечении объекта изкэша)

CacheDuration

Время в секундах нахождения объекта в кэше. Еслииспользуется скользящее устаревание, временнойпредел сбрасывается каждый раз, когда объектизвлекается из кэша. Значение по умолчанию - 0 (илиInfinite) - позволяет хранить кэшированные элементыбесконечно

CacheKeyDependency и

SqlCacheDependency

Позволяет установить зависимость одногокэшированного элемента от другого(CacheKeyDependency) или от таблицы в базе данных(SqlCacheDependency).

http://www.slideshare.net/IgorShkulipa 25

Пример. Default.aspx

<%@ Page Title="Home Page" Language="C#“

MasterPageFile="~/Site.Master"

AutoEventWireup="true"

CodeBehind="Default.aspx.cs"

Inherits="WFApplication1._Default" %>

<asp:Content runat="server" ID="FeaturedContent"

ContentPlaceHolderID="FeaturedContent">

</asp:Content>

<asp:Content runat="server" ID="BodyContent"

ContentPlaceHolderID="MainContent">

<div class="singlebinding">

<asp:TextBox ID="TextBox1" runat="server"

Text="<%#data.TextBoxText%>"></asp:TextBox>

<asp:Label ID="Label1" runat="server"

Text="<%#data.LabelText%>"></asp:Label>

<asp:Label ID="Label2" runat="server"

Text="<%#data.GetRandom(1,10)%>"></asp:Label>

<asp:Label ID="Label3" runat="server"

Text="<%$Random:1,10%>"></asp:Label>

</div>

http://www.slideshare.net/IgorShkulipa 26

Пример. Default.aspx

<div class="multibinding">

<asp:ListBox ID="ListBox1" runat="server" Width="100" Height="150"

DataSource="<%#data.ListBoxItems%>"

DataTextField="Text" DataValueField="Value"

OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"

AutoPostBack="true" OnTextChanged="ListBox1_TextChanged">

</asp:ListBox>

<asp:DetailsView ID="DetailsView1" runat="server"

BorderColor="Black" BorderWidth="1"

Width="350" Height="150"

EmptyDataText="No data"

AutoGenerateRows="false">

<Fields>

<asp:BoundField DataField="Name" HeaderText="Name" ReadOnly="True"

SortExpression="Name" />

<asp:BoundField DataField="Middle" HeaderText="Middle" ReadOnly="True"

SortExpression="Middle" />

<asp:BoundField DataField="Surname" HeaderText="Surname"

ReadOnly="True" SortExpression="Surname" />

<asp:BoundField DataField="Birthday" HeaderText="Birthday"

ReadOnly="True" SortExpression="Birthday" />

<asp:BoundField DataField="Address" HeaderText="Address"

ReadOnly="True" SortExpression="Address" />

<asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True"

SortExpression="Phone" />

<asp:BoundField DataField="Email" HeaderText="Email" ReadOnly="True“

SortExpression="Email" />

</Fields>

</asp:DetailsView>

</div>

</asp:Content>

http://www.slideshare.net/IgorShkulipa 27

Пример. Default.aspx.cs

public class ContactClass

{

public int ID;

public string Name { get; set; }

public string Middle { get; set; }

public string Surname { get; set; }

public DateTime Birthday { get; set; }

public string Address { get; set; }

public string Phone { get; set; }

public string Email { get; set; }

}

http://www.slideshare.net/IgorShkulipa 28

Пример. Default.aspx.cspublic class DataForBinding {

public DataForBinding() {

random = new Random();

TextBoxText = "Hello, Data Binding!";

LabelText = "Random Number:";

TableItems = new List<ContactClass>();

TableItems.Add(new ContactClass {

ID=1, Name = "Ivan",

Middle = "Ivanovich",

Surname = "Ivanov",

Birthday = Convert.ToDateTime("01/01/1980"),

Address = "Ivanovo, Ivanova st., 1",

Phone = "+123 45 678 90 00",

Email = "[email protected]" });

TableItems.Add(new ContactClass {

ID=2, Name = "Petr",

Middle = "Petrovich",

Surname = "Petrov",

Birthday = Convert.ToDateTime("02/02/1980"),

Address = "Petrovo, Petrova st., 2",

Phone = "+098 76 543 21 00",

Email = "[email protected]" });

TableItems.Add(new ContactClass {

ID=3, Name = "Sidor",

Middle = "Sidorovich",

Surname = "Sidorov",

Birthday = Convert.ToDateTime("03/03/1980"),

Address = "Sidorovo, Sidorova st., 1",

Phone = "+765 43 210 98 76",

Email = "[email protected]"

});

}

http://www.slideshare.net/IgorShkulipa 29

Пример. Default.aspx.cspublic string TextBoxText { get; set; }

public string LabelText { get; set; }

public List<ListItem> ListBoxItems

{

get {

var result = from c in TableItems

where true

select new ListItem(c.Name, c.ID.ToString());

return result.ToList<ListItem>();

}

set { }

}

public List<ContactClass> TableItems { get; set; }

public int CurrentID { get; set; }

public List<ContactClass> CurrentContact

{

get {

var result = from c in TableItems

where c.ID==CurrentID

select c;

return result.ToList<ContactClass>();

}

set { }

}

private Random random;

public string GetRandom(int from, int to)

{

return random.Next(from, to).ToString();

}

}

http://www.slideshare.net/IgorShkulipa 30

Пример. Default.aspx.cs

public partial class _Default : Page

{

protected DataForBinding data;

protected void Page_Load(object sender, EventArgs e)

{

data = new DataForBinding();

if (!IsPostBack)

{

this.DataBind();

}

}

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)

{

foreach (ListItem it in ListBox1.Items)

{

if (it.Selected)

{

data.CurrentID = Convert.ToInt32(it.Value);

DetailsView1.DataSource = data.CurrentContact;

DetailsView1.DataBind();

Label2.DataBind();

}

}

}

}

http://www.slideshare.net/IgorShkulipa 31

EditData.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master"

AutoEventWireup="true" CodeBehind="EditData.aspx.cs"

Inherits="WFApplication1.EditData" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">

<div class="multibinding">

<asp:ListBox ID="ListBox1" runat="server" Width="100" Height="150"

DataTextField="Text" DataValueField="Value"

AutoPostBack="true">

</asp:ListBox>

<asp:SqlDataSource ID="SqlDataSource1" runat="server“

ProviderName="System.Data.SqlClient"

ConnectionString="<%$ connectionStrings:Database1Connection %>"

SelectCommand="SELECT CID, CName, CMiddle, CSurname, CEmail FROM Contacts;"

InsertCommand="INSERT INTO Contacts(CName, CMiddle, CSurname, CEmail)

VALUES(@CName, @CMiddle, @CSurname, @CEmail)"

UpdateCommand="UPDATE Contacts SET CName=@CName, CMiddle=@CMiddle,

CSurname=@CSurname, CEmail=@CEmail FROM Contacts WHERE CID=@CID"

DeleteCommand="DELETE FROM Contacts WHERE CID=@CID" />

http://www.slideshare.net/IgorShkulipa 32

EditData.aspx

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"

AutoGenerateColumns="false"

AutoGenerateDeleteButton="true"

AutoGenerateEditButton="true"

DataKeyNames="CID">

<Columns>

<asp:BoundField DataField="CID" HeaderText="№" />

<asp:BoundField DataField="CName" HeaderText="Имя" />

<asp:BoundField DataField="CMiddle" HeaderText="Отчество" />

<asp:BoundField DataField="CSurname" HeaderText="Фамилия" />

<asp:BoundField DataField="CEmail" HeaderText="Почта" />

</Columns>

</asp:GridView>

</div>

</asp:Content>

http://www.slideshare.net/IgorShkulipa 33

RandomExpressionBuilder

public class RandomExpressionBuilder : ExpressionBuilder {

public override CodeExpression GetCodeExpression(

BoundPropertyEntry entry,

object parsedData, ExpressionBuilderContext context) {

string[] numbers = entry.Expression.Split(',');

int from = Convert.ToInt32(numbers[0]);

int to = Convert.ToInt32(numbers[1]);

// Получить ссылку на класс, имеющий метод GetRandom().

CodeTypeReferenceExpression typeRef =

new CodeTypeReferenceExpression(this.GetType());

// Определить параметры для GetRandom().

CodeExpression[] methodParameters = new CodeExpression[2];

methodParameters[0] = new CodePrimitiveExpression(from);

methodParameters[1] = new CodePrimitiveExpression(to);

// Вернуть выражение привязки вызвав метод GetRandom()

CodeMethodInvokeExpression methodCall =

new CodeMethodInvokeExpression(

typeRef, "GetRandom", methodParameters);

return methodCall;

}

public static string GetRandom(int from, int to) {

Random random = new Random();

return random.Next(from, to).ToString();

}

}

}

http://www.slideshare.net/IgorShkulipa 34

Web.config

<connectionStrings>

<add name="DefaultConnection" providerName="System.Data.SqlClient“

connectionString="Data Source=(LocalDb)\v11.0;

Initial Catalog=aspnet-WFApplication1-20141024134931;Integrated

Security=SSPI;

AttachDBFilename=|DataDirectory|\aspnet-WFApplication1-20141024134931.mdf" />

<add name="Database1Connection" providerName="System.Data.SqlClient“

connectionString="Data Source=(LocalDb)\v11.0;

Initial Catalog=aspnet-WFApplication1-20141024134931;

Integrated Security=SSPI;

AttachDBFilename=|DataDirectory|\Database1.mdf" />

</connectionStrings>

...

<system.web>

<compilation debug="true" targetFramework="4.5" >

<expressionBuilders>

<add expressionPrefix="Random“

type="WFApplication1.App_Code.RandomExpressionBuilder"/>

</expressionBuilders>

</compilation>

http://www.slideshare.net/IgorShkulipa 35

Результат

http://www.slideshare.net/IgorShkulipa 36

Результат

http://www.slideshare.net/IgorShkulipa 37

Результат

http://www.slideshare.net/IgorShkulipa 38

Результат

http://www.slideshare.net/IgorShkulipa 39

Лабораторная работа № 6.

Выполнить лабораторную работу №5 с использованием привязки данных.Подключить базу данных и Entity Framework.