Доступ к данным с помощью элементов управления источником данных (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, который демонстрирует добавление элементов управления валидацией, а также настраивает интерфейс вставки таким образом, чтобы пользователь мог выбрать категорию для нового товара из выпадающего списка существующих категорий.