Элемент управления DetailsView – одна из новинок ASP.NET 2.0. Он позволяет просматривать по одной записи из источника данных, тогда как GridView показывает их все сразу. Это можно сравнить с разными типами форм в Access: табличная форма соответствует GridView, а Columnar – DetailsView. Точно так же, как и GridView, DetailsView позволяет разбивку на страницы, редактирование, вставку и удаление с автоматическим связыванием с источником данных. Он также является наследником CompositeDataBoundControl.
Visual Studio 2005 предоставляет, как обычно, Smart Tag, с помощью которого можно задать источник данных, автоформатировать элемент управления, отредактировать поля и шаблоны полей.
Пример DetailsView, где данные берутся из базы данных Northwind, таблица Employees.
Применялось автоформатирование Mocha. Свойства пейджера такие же как у GridView. Единственное отличие – отсутствие свойства PageSize – так как DetailsView всегда отображает одну запись. Например, для навигации по страницам использовать картинки. При этом PagerSettings:Mode должен быть задан как NumericFirstLast.
Так гораздо красивее. Картинки взяты из поставки CorelDraw 11. Странно, что такой возможности не ввели в календаре, надеюсь в следующей версии появится.
Элементы коллекции полей BoundField описываются так же, как и в GridView, но текст заголовка появляется слева, а не сверху. Совместное использование с GridView
Если в записи много полей, то на одной странице в GridView можно отобразить некоторые из них, а в DetailsView выводить полную информацию.
Чтобы это реализовать, нужны два SqlDataSource, которые подсоединяются к одной базе через тот же ConnectionString. Первый – обычный, читает все записи:
Редактирование и удаления делаются точно так, как в GridView.
Метод Bind, в отличие от метода Eval, работает в обе стороны, то есть не только читает данные из источника данных, но и позволяет его обновлять.
Возможность вставки записей DetailsView позволяет расширить возможности работы с источниками данных в ASP .NET 2.0. События DetailsView
У DetailsView имеются пары событий, которые происходят при связывании с данными, при переходе из режима просмотра в режим вставки, при перелистывании страницы.
ItemCreated
ItemDeleting - ItemDeleted
ItemInserted - ItemInserting
ItemUpdated - ItemUpdating
ModeChanged - ModeChanging
В таблице Employees некоторые поля должны быть заполнены, у них стоит AllowNulls=false. Поэтому при работе нашей формы произойдет исключение, если попытаться вставить запись, не введя имя и фамилию. Чтобы избежать этого, во время обработки события ItemInserting нужно сделать проверку. Также обработаем событие ModeChanged, чтобы напомнить клиенту о его обязанностях. ))
protected void DetailsView1_ModeChanged(object sender, EventArgs e) { switch (DetailsView1.CurrentMode) { case DetailsViewMode.Insert: DetailsView1.HeaderText = Заполните, пожалуйста, форму. Имя и фамилия обязательны.; DetailsView1.HeaderStyle.ForeColor = System.Drawing.Color.Purple; DetailsView1.HeaderStyle.BackColor = System.Drawing.Color.AliceBlue; break; case DetailsViewMode.ReadOnly: DetailsView1.HeaderText = Личное дело; DetailsView1.HeaderStyle.ForeColor = System.Drawing.Color.White; DetailsView1.HeaderStyle.BackColor = System.Drawing.Color.FromArgb(0x507CD1); break; } }
Так как DetailsView1 все-таки таблица, ищем поля ввода в 0 и 1 строке в 1 столбце. Если там пусто, отменим вставку.
Предположим, мы нашли табличное представление информации о работнике слишком скучным. Мы хотим написать список характеристик работников в виде связного текста, а в DetailsView оставить только координаты(адрес, телефон).
Характеристика пишется с помощью элемента Repeater. Внутри него находится DetailsView. Источник данных рипитера– таблица Employees, как и выше. А какой установить источник у DetailsView? Если таким же, то для всех записей будет выводится та же самая информация – из первой записи таблицы. Так что для каждой записи нужен свой источник, отфильтрованный в соответствии с EmployeeID.
<asp:SqlDataSource ID=SqlDataSource1 runat=server ConnectionString=<%$ ConnectionStrings:NorthwindConnectionString1 %> SelectCommand=SELECT * FROM [Employees] > </asp:SqlDataSource> <br> <asp:Repeater ID=Repeater1 runat=server DataSourceID=SqlDataSource1 OnItemCreated=Repeater1_ItemCreated> <ItemTemplate> <%# DataBinder.Eval(Container.DataItem, TitleOfCourtesy) %> <%# DataBinder.Eval(Container.DataItem, FirstName) %> <%# DataBinder.Eval(Container.DataItem, LastName) %> was born in <%# ((DateTime)DataBinder.Eval(Container.DataItem, BirthDate)).ToLongDateString() %>. <p> <p>He/She lives in <%# DataBinder.Eval(Container.DataItem, City) %> of the great country <%# DataBinder.Eval(Container.DataItem, Country) %>. </p> <p>We appreciate her work as <%# DataBinder.Eval(Container.DataItem, Title) %>.</p> <p><%# DataBinder.Eval(Container.DataItem, Notes) %></p> <asp:DetailsView ID=DetailsView1 runat=server AutoGenerateRows=False DataKeyNames=EmployeeID Height=50px Width=82%> <Fields> <asp:BoundField DataField=Address HeaderText=Address SortExpression=Address /> <asp:BoundField DataField=Region HeaderText=Region SortExpression=Region /> <asp:BoundField DataField=PostalCode HeaderText=PostalCode SortExpression=PostalCode /> <asp:BoundField DataField=HomePhone HeaderText=HomePhone SortExpression=HomePhone /> <asp:BoundField DataField=Extension HeaderText=Extension SortExpression=Extension /> <asp:ImageField HeaderText=Photo DataImageUrlField=PhotoPath> </asp:ImageField> </Fields> </asp:DetailsView> </ItemTemplate> <SeparatorTemplate><hr width=80% dir=rtl></SeparatorTemplate> </asp:Repeater>
Во время обработки события ItemCreated, когда данные еще не связаны, можно динамически связать DetailsView с данными.
Точно так же можно связать DetailsView с BulletedList, с DropDownList и другими.
Обобщая сказанное, можно сказать, что DetailsView – это не только вертикальная таблица с возможностью рассмотреть детали интересующей записи, но и возможность вставлять записи в таблицу, не создавая дополнительных элементов управления и не писать при этом большого количества кода.