Доступ к данным с помощью элементов управления источником данных (DataSource) в ASP.NET 2.0 - Вставка данных при помощи элемента управления DetailsView
ОГЛАВЛЕНИЕ
Вставка данных при помощи элемента управления DetailsView
В ASP.NET 2.0 было представлено несколько новых элементов управления данными, к примеру, GridView, DetailsView, FormView и др. Элементы управления DetailsView и FormView отображают информацию о единственной записи (в отличие от GridView, который отображает информацию о множестве записей). Элементы DetailsView и FormView также можно настроить на отображение интерфейса вставки. Вкратце, вы можете также использовать элементы управления DetailsView или FormView для того, чтобы создать интерфейс вставки информации в базу данных, при этом, не написав и строки кода!
Элемент управления DetailsView против FormView |
---|
Элементы управления DetailsView и FormView имеют много общего - они оба отображают по одной записи и могут отображать интерфейс для вставки и обновления данных. Отличие между двумя элементами заключается в том, что элемент DetailsView составлен из DataFields (BoundFields, CheckBoxFields, TemplateFields и т.д.), также, как и GridView. В результате этого вы увидите приземистый квадратный вид элемента. С другой стороны, FormView использует шаблоны вместо DataFields; следовательно, у вас есть возможность использовать более гибкую разметку для интерфейсов отображения, вставки и обновления. |
Начните с добавления элемента управления SqlDataSource на страницу и используйте тот же InsertCommand, что и в предыдущем примере:
INSERT INTO Products(ProductName, CategoryID, UnitPrice, Discontinued)
VALUES (@ProductName, @CategoryID, @UnitPrice, @Discontinued)
Далее, добавьте параметры к набору InsertParameters элемента. Вместо того чтобы использовать ControlParameters, используйте стандартный объект Parameter. Также DetailsView, который мы создадим для данного примера, не будет включать в себя интерфейс для указания категории. Поэтому установите соответствующее DefaultValue объекта Parameter в "1". Это назначит все товары, добавленные посредством данной страницы, принадлежат категории напитков.
<asp:SqlDataSource ID="AddProductDataSource" runat="server" ConnectionString="..."
InsertCommand="INSERT INTO Products(ProductName, CategoryID, UnitPrice, Discontinued) VALUES (@ProductName, @CategoryID, @UnitPrice, @Discontinued)"
ProviderName="...">
<InsertParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="CategoryID" DefaultValue="1" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
</InsertParameters>
</asp:SqlDataSource>
Далее, добавьте DetailsView на страницу и установите его свойство DataSourceID в значение ID элемента управления SqlDataSource (AddProductDataSource). Из смарт-тега DetailsView отметьте кнопку "Enable Inserting". Это добавит CommandField к DetailsView и установит его свойство ShowInsertButton в значение True. CommandField, при данной настройке, отображает кнопку "New", когда элемент DetailsView находится в режиме ReadOnly. При нажатии на кнопку "New" вызывается постбэк и DetailsView переходит в режим Insert, тем самым заставляя CommandField отображать кнопки "Insert" и "Cancel".
Элемент управления SqlDataSource не содержит значения для своего SelectCommand, так что в DetailsView ничего не будет отображено. На самом деле, для данного примера мы хотим, чтобы DetailsView всегда был в режиме вставки (чтобы пользователю не приходилось всякий раз нажимать кнопку"New" для добавления новой записи). Установите свойство DefaultMode элемента DetailsView в Insert , тем самым указав то, что DetailsView должен отображать только свой интерфейс вставки
Далее, добавьте два BoundFields и CheckBoxField к DetailsView, установив свойства HeaderText и DataField таким образом, чтобы они были привязаны к колонкам ProductName, UnitPrice и Discontinued , используемым элементом SqlDataSource. Наконец, установите свойство AutoGenerateRows в False.
Вы можете сделать это из диалогового окна полей (Fields) либо вручную ввести декларативную разметку элемента. Для того чтобы использовать диалоговое окно Fields, нажмите на ссылку Edit Fields из смарт-тега DetailsView. Добавьте два BoundFields и CheckBoxField и установите их свойства в списке справа. Чтобы установить свойство AutoGenerateRows в False, просто отключите "Auto-generate fields" в нижнем левом углу.

В качестве альтернативы вы можете указать поля DetailsView и установить свойство AutoGenerateRows в False посредством следующего декларативного синтаксиса:
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="AddProductDataSource"
DefaultMode="Insert" CellPadding="4" ForeColor="#333333" GridLines="None">
<Fields>
<asp:BoundField DataField="ProductName" HeaderText="Product Name:" />
<asp:BoundField DataField="UnitPrice" HeaderText="Unit Price:" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued:" />
<asp:CommandField ShowInsertButton="True" />
</Fields>
</asp:DetailsView>
И это все! Когда пользователь посещает страницу и вводит название, цену и статус скидки товара и нажимает Insert - вызывается постбэк. DetailsView автоматически присвоит значения элементов управления ввода соответствующим параметрам вставки (InsertParameters) элемента SqlDataSource до того, как начнется цикл вставки. Результатом будет вставка новой записи в базу данных, причем без написания и единой строчки кода, а также без необходимости сопоставления вручную InsertParameters элемента SqlDataSource с их источниками (поскольку DetailsView делает это автоматически - в момент, когда нажимают кнопку Insert).

Данный пример демонстрирует только простые возможности DetailsView и не включает в себя важные моменты, такие как валидация ввода и специализация интерфейса вставки. К примеру, поскольку требуется наличие значения в колонке ProductName, вставка не будет выполнена в случае, если пользователь не заполнит данное текстовое поле. Аналогично в случае, если пользователь введет неправильное значение цены (к примеру "expensive!"), то произойдет ошибка при попытке вставить значение в базу данных. Приложение к данной статье включает в себя другой пример DetailsView, который демонстрирует добавление элементов управления валидацией, а также настраивает интерфейс вставки таким образом, чтобы пользователь мог выбрать категорию для нового товара из выпадающего списка существующих категорий.