Общие сведения о вставке, обновлении и удалении данных (C#)An Overview of Inserting, Updating, and Deleting Data (C#)

по Скотт Митчеллby Scott Mitchell

Скачивание примера приложения или Загрузка PDF-файлаDownload Sample App or Download PDF

В этом учебнике мы рассмотрим, как сопоставлять методы вставки (), Update () и Delete () ObjectDataSource с методами классов BLL, а также как настроить элементы управления GridView, DetailsView и FormView для предоставления возможностей изменения данных.In this tutorial we'll see how to map an ObjectDataSource's Insert(), Update(), and Delete() methods to the methods of BLL classes, as well as how to configure the GridView, DetailsView, and FormView controls to provide data modification capabilities.

ВведениеIntroduction

В нескольких прошлых учебных курсах мы рассмотрели, как отображать данные на странице ASP.NET с помощью элементов управления GridView, DetailsView и FormView.Over the past several tutorials we've examined how to display data in an ASP.NET page using the GridView, DetailsView, and FormView controls. Эти элементы управления просто работают с предоставляемыми им данными.These controls simply work with data supplied to them. Как правило, эти элементы управления обращаются к данным с помощью элемента управления источниками данных, например ObjectDataSource.Commonly, these controls access data through the use of a data source control, such as the ObjectDataSource. Мы увидели, как элемент управления ObjectDataSource выступает в качестве прокси-сервера между страницей ASP.NET и базовыми данными.We've seen how the ObjectDataSource acts as a proxy between the ASP.NET page and the underlying data. Когда GridView необходимо отображать данные, он вызывает метод Select() ObjectDataSource, который, в свою очередь, вызывает метод из уровня бизнес-логики (BLL), который вызывает метод в соответствующем адаптере (DAL) уровня доступа к данным, который, в свою очередь, отправляет запрос SELECT в базу данных Northwind.When a GridView needs to display data, it invokes its ObjectDataSource's Select() method, which in turn invokes a method from our Business Logic Layer (BLL), which calls a method in the appropriate Data Access Layer's (DAL) TableAdapter, which in turn sends a SELECT query to the Northwind database.

Вспомним, что при создании TableAdapters в DAL в первом учебном курсеVisual Studio автоматически добавила методы для вставки, обновления и удаления данных из базовой таблицы базы данных.Recall that when we created the TableAdapters in the DAL in our first tutorial, Visual Studio automatically added methods for inserting, updating, and deleting data from the underlying database table. Более того, при создании уровня бизнес-логики мы разработали в BLL методы, которые вызывали эти методы DAL по изменению данных.Moreover, in Creating a Business Logic Layer we designed methods in the BLL that called down into these data modification DAL methods.

В дополнение к методу Select(), ObjectDataSource также имеет методы Insert(), Update()и Delete().In addition to its Select() method, the ObjectDataSource also has Insert(), Update(), and Delete() methods. Как и метод Select(), эти три метода можно сопоставить с методами в базовом объекте.Like the Select() method, these three methods can be mapped to methods in an underlying object. При настройке для вставки, обновления или удаления данных элементы управления GridView, DetailsView и FormView предоставляют пользовательский интерфейс для изменения базовых данных.When configured to insert, update, or delete data, the GridView, DetailsView, and FormView controls provide a user interface for modifying the underlying data. Этот пользовательский интерфейс вызывает методы Insert(), Update()и Delete() ObjectDataSource, которые затем вызывают связанные с ним методы базового объекта (см. рис. 1).This user interface calls the Insert(), Update(), and Delete() methods of the ObjectDataSource, which then invoke the underlying object's associated methods (see Figure 1).

методы вставки (), обновления () и удаления () ObjectDataSource являются прокси-сервером в BLLThe ObjectDataSource's Insert(), Update(), and Delete() Methods Serve as a Proxy into the BLL

Рис. 1. методы Insert(), Update()и Delete() ObjectDataSource являются прокси-сервером в BLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 1: The ObjectDataSource's Insert(), Update(), and Delete() Methods Serve as a Proxy into the BLL (Click to view full-size image)

В этом учебнике мы рассмотрим, как сопоставлять методы Insert(), Update()и Delete() ObjectDataSource с методами классов в BLL, а также как настроить элементы управления GridView, DetailsView и FormView для предоставления возможностей изменения данных.In this tutorial we'll see how to map the ObjectDataSource's Insert(), Update(), and Delete() methods to methods of classes in the BLL, as well as how to configure the GridView, DetailsView, and FormView controls to provide data modification capabilities.

Шаг 1. Создание веб-страниц учебников по вставке, обновлению и удалениюStep 1: Creating the Insert, Update, and Delete Tutorials Web Pages

Прежде чем начать изучение вставки, обновления и удаления данных, давайте сначала создадим страницы ASP.NET в нашем проекте веб-сайта, которые понадобятся для работы с этим руководством и следующих нескольких.Before we start exploring how to insert, update, and delete data, let's first take a moment to create the ASP.NET pages in our website project that we'll need for this tutorial and the next several ones. Для начала добавьте новую папку с именем EditInsertDelete.Start by adding a new folder named EditInsertDelete. Затем добавьте в эту папку следующие страницы ASP.NET, чтобы связать каждую страницу с главной страницей Site.master:Next, add the following ASP.NET pages to that folder, making sure to associate each page with the Site.master master page:

  • Default.aspx
  • Basics.aspx
  • DataModificationEvents.aspx
  • ErrorHandling.aspx
  • UIValidation.aspx
  • CustomizedUI.aspx
  • OptimisticConcurrency.aspx
  • ConfirmationOnDelete.aspx
  • UserLevelAccess.aspx

Добавление страниц ASP.NET для руководств, связанных с изменением данных

Рис. 2. добавление страниц ASP.NET для руководств, связанных с изменением данныхFigure 2: Add the ASP.NET Pages for the Data Modification-Related Tutorials

Как и в других папках, Default.aspx в папке EditInsertDelete будут перечислены учебники в разделе.Like in the other folders, Default.aspx in the EditInsertDelete folder will list the tutorials in its section. Вспомним, что SectionLevelTutorialListing.ascx пользовательский элемент управления предоставляет эти функции.Recall that the SectionLevelTutorialListing.ascx User Control provides this functionality. Таким образом, добавьте этот пользовательский элемент управления в Default.aspx, перетащив его из обозреватель решений на представление конструирования страницы.Therefore, add this User Control to Default.aspx by dragging it from the Solution Explorer onto the page's Design view.

добавить пользовательский элемент управления SectionLevelTutorialListing. ascx в Default. aspxAdd the SectionLevelTutorialListing.ascx User Control to Default.aspx

Рис. 3. Добавление пользовательского элемента управления SectionLevelTutorialListing.ascx в Default.aspx (щелкните, чтобы просмотреть изображение с полным размером)Figure 3: Add the SectionLevelTutorialListing.ascx User Control to Default.aspx (Click to view full-size image)

Наконец, добавьте страницы в качестве записей в файл Web.sitemap.Lastly, add the pages as entries to the Web.sitemap file. В частности, добавьте следующую разметку после настраиваемого <siteMapNode>форматирования:Specifically, add the following markup after the Customized Formatting <siteMapNode>:

<siteMapNode title="Editing, Inserting, and Deleting"
    url="~/EditInsertDelete/Default.aspx"
    description="Samples of Reports that Provide Editing, Inserting,
                  and Deleting Capabilities">
    <siteMapNode url="~/EditInsertDelete/Basics.aspx"
        title="Basics"
        description="Examines the basics of data modification with the
                      GridView, DetailsView, and FormView controls." />
    <siteMapNode url="~/EditInsertDelete/DataModificationEvents.aspx"
        title="Data Modification Events"
        description="Explores the events raised by the ObjectDataSource
                      pertinent to data modification." />
    <siteMapNode url="~/EditInsertDelete/ErrorHandling.aspx"
        title="Error Handling"
        description="Learn how to gracefully handle exceptions raised
                      during the data modification workflow." />
    <siteMapNode url="~/EditInsertDelete/UIValidation.aspx"
        title="Adding Data Entry Validation"
        description="Help prevent data entry errors by providing validation." />
    <siteMapNode url="~/EditInsertDelete/CustomizedUI.aspx"
        title="Customize the User Interface"
        description="Customize the editing and inserting user interfaces." />
    <siteMapNode url="~/EditInsertDelete/OptimisticConcurrency.aspx"
        title="Optimistic Concurrency"
        description="Learn how to help prevent simultaneous users from
                      overwritting one another s changes." />
    <siteMapNode url="~/EditInsertDelete/ConfirmationOnDelete.aspx"
        title="Confirm On Delete"
        description="Prompt a user for confirmation when deleting a record." />
    <siteMapNode url="~/EditInsertDelete/UserLevelAccess.aspx"
        title="Limit Capabilities Based on User"
        description="Learn how to limit the data modification functionality
                      based on the user role or permissions." />
</siteMapNode>

После обновления Web.sitemapпросмотрите веб-сайт учебников в браузере.After updating Web.sitemap, take a moment to view the tutorials website through a browser. В меню слева теперь содержатся элементы для учебников по редактированию, вставке и удалению.The menu on the left now includes items for the editing, inserting, and deleting tutorials.

На карте веб-узла теперь есть записи для учебников по редактированию, вставке и удалению.

Рис. 4. схема узла теперь включает в себя записи для руководства по редактированию, вставке и удалениюFigure 4: The Site Map Now Includes Entries for the Editing, Inserting, and Deleting Tutorials

Шаг 2. Добавление и настройка элемента управления ObjectDataSourceStep 2: Adding and Configuring the ObjectDataSource Control

Поскольку GridView, DetailsView и FormView имеют разные возможности изменения данных и макет, давайте рассмотрим каждый из них по отдельности.Since the GridView, DetailsView, and FormView each differ in their data modification capabilities and layout, let's examine each one individually. Однако, вместо того, чтобы каждый элемент управления использовал собственный объект ObjectDataSource, давайте создадим только один объект ObjectDataSource, который может совместно использоваться всеми тремя примерами элементов управления.Rather than have each control using its own ObjectDataSource, however, let's just create a single ObjectDataSource that all three control examples can share.

Откройте страницу Basics.aspx, перетащите элемент управления ObjectDataSource из области элементов в конструктор и щелкните ссылку Настроить источник данных из своего смарт-тега.Open the Basics.aspx page, drag an ObjectDataSource from the Toolbox onto the Designer, and click the Configure Data Source link from its smart tag. Поскольку ProductsBLL является единственным классом BLL, предоставляющим методы редактирования, вставки и удаления, настройте ObjectDataSource для использования этого класса.Since the ProductsBLL is the only BLL class that provides editing, inserting, and deleting methods, configure the ObjectDataSource to use this class.

настроить ObjectDataSource для использования класса ProductsBLLConfigure the ObjectDataSource to Use the ProductsBLL Class

Рис. 5. Настройка ObjectDataSource для использования класса ProductsBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 5: Configure the ObjectDataSource to Use the ProductsBLL Class (Click to view full-size image)

На следующем экране можно указать, какие методы класса ProductsBLL сопоставляются Select(), Insert(), Update()и Delete() ObjectDataSource, выбрав соответствующую вкладку и выбрав метод из раскрывающегося списка.In the next screen we can specify what methods of the ProductsBLL class are mapped to the ObjectDataSource's Select(), Insert(), Update(), and Delete() by selecting the appropriate tab and choosing the method from the drop-down list. Рис. 6, который должен выглядеть знакомым, теперь сопоставляет метод Select() ObjectDataSource с методом GetProducts() класса ProductsBLL.Figure 6, which should look familiar by now, maps the ObjectDataSource's Select() method to the ProductsBLL class's GetProducts() method. Методы Insert(), Update()и Delete() можно настроить, выбрав соответствующую вкладку в верхней части списка.The Insert(), Update(), and Delete() methods can be configured by selecting the appropriate tab from the list along the top.

, что ObjectDataSource возвращает все продуктыHave the ObjectDataSource Return All of the Products

Рис. 6. возвращение всех продуктов с помощью ObjectDataSource (щелкните, чтобы просмотреть изображение с полным размером)Figure 6: Have the ObjectDataSource Return All of the Products (Click to view full-size image)

На рисунках 7, 8 и 9 показаны вкладки обновления, вставки и удаления элемента управления ObjectDataSource.Figures 7, 8, and 9 show the ObjectDataSource's UPDATE, INSERT, and DELETE tabs. Настройте эти вкладки таким образом, чтобы методы Insert(), Update()и Delete() вызывали методы UpdateProduct, AddProductи DeleteProduct класса ProductsBLL соответственно.Configure these tabs so that the Insert(), Update(), and Delete() methods invoke the ProductsBLL class's UpdateProduct, AddProduct, and DeleteProduct methods, respectively.

привяжите метод Update () ObjectDataSource к методу UpdateProduct класса ПродуктбллMap the ObjectDataSource's Update() Method to the ProductBLL Class's UpdateProduct Method

Рис. 7. сопоставьте метод Update() ObjectDataSource с методом UpdateProduct класса ProductBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 7: Map the ObjectDataSource's Update() Method to the ProductBLL Class's UpdateProduct Method (Click to view full-size image)

сопоставлять метод вставки () ObjectDataSource с методом AddProduct класса ПродуктбллMap the ObjectDataSource's Insert() Method to the ProductBLL Class's AddProduct Method

Рис. 8. привязка метода Insert() ObjectDataSource к методу Add Product класса ProductBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 8: Map the ObjectDataSource's Insert() Method to the ProductBLL Class's Add Product Method (Click to view full-size image)

соотнести метод Delete () ObjectDataSource с методом DeleteProduct класса ПродуктбллMap the ObjectDataSource's Delete() Method to the ProductBLL Class's DeleteProduct Method

Рис. 9. сопоставьте метод Delete() ObjectDataSource с методом DeleteProduct класса ProductBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 9: Map the ObjectDataSource's Delete() Method to the ProductBLL Class's DeleteProduct Method (Click to view full-size image)

Возможно, вы заметили, что в раскрывающихся списках на вкладках обновления, вставки и удаления уже были выбраны эти методы.You may have noticed that the drop-down lists in the UPDATE, INSERT, and DELETE tabs already had these methods selected. Это спасибо за использование DataObjectMethodAttribute, которые оформляют методы ProductsBLL.This is thanks to our use of the DataObjectMethodAttribute that decorates the methods of ProductsBLL. Например, метод DeleteProduct имеет следующую сигнатуру:For example, the DeleteProduct method has the following signature:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Delete, true)]
public bool DeleteProduct(int productID)
{
    ...
}

Атрибут DataObjectMethodAttribute указывает назначение каждого метода — выбор, вставка, обновление или удаление, а также значение по умолчанию.The DataObjectMethodAttribute attribute indicates the purpose of each method whether it is for selecting, inserting, updating, or deleting and whether or not it's the default value. Если эти атрибуты пропущены при создании классов BLL, необходимо вручную выбрать эти методы на вкладках обновление, вставка и удаление.If you omitted these attributes when creating your BLL classes, you'll need to manually select the methods from the UPDATE, INSERT, and DELETE tabs.

Убедившись, что соответствующие методы ProductsBLL сопоставляются с методами Insert(), Update()и Delete() ObjectDataSource, нажмите кнопку Готово, чтобы завершить работу мастера.After ensuring that the appropriate ProductsBLL methods are mapped to the ObjectDataSource's Insert(), Update(), and Delete() methods, click Finish to complete the wizard.

Проверка разметки ObjectDataSourceExamining the ObjectDataSource's Markup

После настройки ObjectDataSource с помощью мастера перейдите к представлению исходного кода, чтобы проверить созданную декларативную разметку.After configuring the ObjectDataSource through its wizard, go to the Source view to examine the generated declarative markup. Тег <asp:ObjectDataSource> указывает базовый объект и методы для вызова.The <asp:ObjectDataSource> tag specifies the underlying object and the methods to invoke. Кроме того, существуют DeleteParameters, UpdateParametersи InsertParameters, которые сопоставляются с входными параметрами для методов AddProduct, UpdateProductи DeleteProduct класса ProductsBLL:Additionally, there are DeleteParameters, UpdateParameters, and InsertParameters that map to the input parameters for the ProductsBLL class's AddProduct, UpdateProduct, and DeleteProduct methods:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    DeleteMethod="DeleteProduct" InsertMethod="AddProduct"
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts"
    TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
    <DeleteParameters>
        <asp:Parameter Name="productID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="unitsInStock" Type="Int16" />
        <asp:Parameter Name="unitsOnOrder" Type="Int16" />
        <asp:Parameter Name="reorderLevel" Type="Int16" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
    </InsertParameters>
</asp:ObjectDataSource>

ObjectDataSource включает параметр для каждого из входных параметров для связанных с ним методов, так же как список SelectParameter s присутствует, когда ObjectDataSource настроен для вызова метода Select, ожидающего входного параметра (например, GetProductsByCategoryID(categoryID)).The ObjectDataSource includes a parameter for each of the input parameters for its associated methods, just like a list of SelectParameter s is present when the ObjectDataSource is configured to call a select method that expects an input parameter (such as GetProductsByCategoryID(categoryID)). Как скоро будет видно, значения этих DeleteParameters, UpdateParametersи InsertParameters задаются автоматически с помощью элементов управления GridView, DetailsView и FormView перед вызовом метода Insert(), Update()или Delete() ObjectDataSource.As we'll see shortly, values for these DeleteParameters, UpdateParameters, and InsertParameters are set automatically by the GridView, DetailsView, and FormView prior to invoking the ObjectDataSource's Insert(), Update(), or Delete() method. Эти значения также можно задать программным способом, как описано в следующем учебном курсе.These values can also be set programmatically as needed, as we'll discuss in a future tutorial.

Одним из побочных эффектов использования мастера для настройки ObjectDataSource является то, что Visual Studio устанавливает для свойства OldValuesParameterFormatString значение original_{0}.One side effect of using the wizard to configure to ObjectDataSource is that Visual Studio sets the OldValuesParameterFormatString property to original_{0}. Это значение свойства используется для включения исходных значений изменяемых данных и полезно в двух сценариях:This property value is used to include the original values of the data being edited and is useful in two scenarios:

  • Если при редактировании записи пользователь может изменить значение первичного ключа.If, when editing a record, users are able to change the primary key value. В этом случае необходимо предоставить новое значение первичного ключа и исходное значение первичного ключа, чтобы можно было найти запись с исходным значением первичного ключа и соответствующим образом обновить его значение.In this case, both the new primary key value and the original primary key value must be provided so that the record with the original primary key value can be found and have its value updated accordingly.
  • При использовании оптимистичного параллелизма.When using optimistic concurrency. Оптимистическая блокировка — это метод, гарантирующий, что два одновременно работающих пользователя не перезапишут изменения, и это раздел для будущего руководства.Optimistic concurrency is a technique to ensure that two simultaneous users don't overwrite one another's changes, and is the topic for a future tutorial.

Свойство OldValuesParameterFormatString указывает имя входных параметров в методах Update и DELETE базового объекта для исходных значений.The OldValuesParameterFormatString property indicates the name of the input parameters in the underlying object's update and delete methods for the original values. Мы обсудим это свойство и его назначение более подробно при рассмотрении оптимистичного параллелизма.We'll discuss this property and its purpose in greater detail when we explore optimistic concurrency. Однако я выберу его сейчас, так как методы BLL не предполагают исходные значения, поэтому важно удалить это свойство.I bring it up now, however, because our BLL's methods do not expect the original values and therefore it's important that we remove this property. Если для свойства OldValuesParameterFormatString задано значение, отличное от значения по умолчанию ({0}), то при попытке веб-элемента управления данными вызвать методы Update() или Delete() будет возникать ошибка, так как ObjectDataSource попытается передать как UpdateParameters, так и DeleteParameters, как и исходные параметры значения.Leaving the OldValuesParameterFormatString property set to anything other than the default ({0}) will cause an error when a data Web control attempts to invoke the ObjectDataSource's Update() or Delete() methods because the ObjectDataSource will attempt to pass in both the UpdateParameters or DeleteParameters specified as well as original value parameters.

Если это не совсем понятно в этом присоединении ке, не беспокойтесь, мы рассмотрим это свойство и его служебную программу в следующем учебном курсе.If this isn't terribly clear at this juncture, don't worry, we'll examine this property and its utility in a future tutorial. Сейчас нужно просто удалить это объявление свойства целиком из декларативного синтаксиса или установить значение по умолчанию ({0}).For now, just be certain to either remove this property declaration entirely from the declarative syntax or set the value to the default value ({0}).

Note

Если вы просто удаляете значение свойства OldValuesParameterFormatString из окно свойств в представление конструирования, оно по-прежнему будет существовать в декларативном синтаксисе, но должно быть задано как пустая строка.If you simply clear out the OldValuesParameterFormatString property value from the Properties window in the Design view, the property will still exist in the declarative syntax, but be set to an empty string. Это, увы, по-прежнему приведет к возникновению описанной выше проблемы.This, unfortunately, will still result in the same problem discussed above. Поэтому либо удалите свойство из декларативного синтаксиса, либо из окно свойств, установите значение по умолчанию {0}.Therefore, either remove the property altogether from the declarative syntax or, from the Properties window, set the value to the default, {0}.

Шаг 3. Добавление веб-элемента управления данными и его настройка для изменения данныхStep 3: Adding a Data Web Control and Configuring It for Data Modification

После того как ObjectDataSource добавлен на страницу и настроен, мы готовы к добавлению веб-элементов управления данными на страницу, чтобы отобразить данные и предоставить пользователю возможность изменить их.Once the ObjectDataSource has been added to the page and configured, we're ready to add data Web controls to the page to both display the data and provide a means for the end user to modify it. Мы будем просматривать GridView, DetailsView и FormView отдельно, так как эти веб-элементы управления данными отличаются возможностями и конфигурацией изменения данных.We'll look at the GridView, DetailsView, and FormView separately, as these data Web controls differ in their data modification capabilities and configuration.

Как мы увидим в оставшейся части этой статьи, Добавление базовой поддержки редактирования, вставки и удаления с помощью элементов управления GridView, DetailsView и FormView — это так же просто, как проверка нескольких флажков.As we'll see in the remainder of this article, adding very basic editing, inserting, and deleting support through the GridView, DetailsView, and FormView controls is really as simple as checking a couple of checkboxes. В реальной среде существует множество тонкостей и пограничных вариантов, которые обеспечивают более функциональную функциональность, чем просто наpointсь и щелкая.There are many subtleties and edge cases in the real-world that make providing such functionality more involved than just point and click. Тем не менее, в этом учебнике основное внимание уделяется исключительно упрощению возможностей изменения данных.This tutorial, however, focuses solely on proving simplistic data modification capabilities. В следующих учебных курсах будут рассмотрены проблемы, которые, как нереальности, будут возникать в реальных параметрах.Future tutorials will examine concerns that will undoubtedly arise in a real-world setting.

Удаление данных из GridViewDeleting Data from the GridView

Начните с перетаскивания элемента управления GridView с панели инструментов в конструктор.Start by dragging a GridView from the Toolbox onto the Designer. Затем привяжите ObjectDataSource к GridView, выбрав его из раскрывающегося списка в смарт-теге GridView.Next, bind the ObjectDataSource to the GridView by selecting it from the drop-down list in the GridView's smart tag. На этом этапе декларативная разметка GridView будет выглядеть следующим образом:At this point the GridView's declarative markup will be:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False"
            ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName"
            SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
           SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
           SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit"
           HeaderText="QuantityPerUnit"
           SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
           SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
           HeaderText="UnitsInStock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
           HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel"
           HeaderText="ReorderLevel" SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
        <asp:BoundField DataField="CategoryName"
           HeaderText="CategoryName" ReadOnly="True"
            SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
            HeaderText="SupplierName" ReadOnly="True"
            SortExpression="SupplierName" />
    </Columns>
</asp:GridView>

Привязка элемента управления GridView к ObjectDataSource через его смарт-тег имеет два преимущества:Binding the GridView to the ObjectDataSource through its smart tag has two benefits:

  • BoundFields и Чеккбоксфиелдс создаются автоматически для каждого поля, возвращаемого ObjectDataSource.BoundFields and CheckBoxFields are automatically created for each of the fields returned by the ObjectDataSource. Более того, свойства BoundField и CheckBoxField задаются на основе метаданных базового поля.Moreover, the BoundField and CheckBoxField's properties are set based on the underlying field's metadata. Например, поля ProductID, CategoryNameи SupplierName помечаются как доступные только для чтения в ProductsDataTable и поэтому не должны обновляться при редактировании.For example, the ProductID, CategoryName, and SupplierName fields are marked as read-only in the ProductsDataTable and therefore shouldn't be updatable when editing. Для этого свойства ReadOnly BoundFields имеют значение true.To accommodate this, these BoundFields' ReadOnly properties are set to true.
  • Свойству DataKeyNames присваивается поле первичного ключа базового объекта.The DataKeyNames property is assigned to the primary key field(s) of the underlying object. Это важно при использовании элемента управления GridView для редактирования или удаления данных, так как это свойство указывает поле (или набор полей), уникально идентифицирующее каждую запись.This is essential when using the GridView for editing or deleting data, as this property indicates the field (or set of fields) that unique identifies each record. Дополнительные сведения о свойстве DataKeyNames см. в разделе " основной/подробности" с помощью выбираемого справочника по GridView с подробным руководством по DetailView.For more information on the DataKeyNames property, refer back to the Master/Detail Using a Selectable Master GridView with a Details DetailView tutorial.

Хотя GridView можно привязать к ObjectDataSource через окно свойств или декларативный синтаксис, это требует ручного добавления соответствующей разметки BoundField и DataKeyNames.While the GridView can be bound to the ObjectDataSource through the Properties window or declarative syntax, doing so requires you to manually add the appropriate BoundField and DataKeyNames markup.

Элемент управления GridView обеспечивает встроенную поддержку редактирования и удаления на уровне строк.The GridView control provides built-in support for row-level editing and deleting. Настройка GridView для поддержки удаления добавляет столбец кнопок удаления.Configuring a GridView to support deleting adds a column of Delete buttons. Когда пользователь нажимает кнопку Удалить для определенной строки, выполняется обратная передача, и GridView выполняет следующие действия:When the end user clicks the Delete button for a particular row, a postback ensues and the GridView performs the following steps:

  1. Значения DeleteParameters ObjectDataSource назначеныThe ObjectDataSource's DeleteParameters value(s) are assigned
  2. Вызывается метод Delete() ObjectDataSource, удаляя указанную записьThe ObjectDataSource's Delete() method is invoked, deleting the specified record
  3. Элемент управления GridView повторно привязывается к ObjectDataSource, вызывая метод Select()The GridView rebinds itself to the ObjectDataSource by invoking its Select() method

Значения, присваиваемые DeleteParameters, являются значениями полей DataKeyNames строки, для которых была нажата кнопка Delete.The values assigned to the DeleteParameters are the values of the DataKeyNames field(s) for the row whose Delete button was clicked. Поэтому крайне важно, чтобы свойство DataKeyNames GridView было правильно установлено.Therefore it's vital that a GridView's DataKeyNames property be correctly set. Если он отсутствует, DeleteParameters будет назначено null значение на шаге 1, что, в свою очередь, не приведет к удалению записей на шаге 2.If it's missing, the DeleteParameters will be assigned a null value in Step 1, which in turn will not result in any deleted records in Step 2.

Note

Коллекция DataKeys хранится в состоянии управления GridView s, что означает, что DataKeys значения будут сохраняться в обратной передаче, даже если состояние представления GridView s было отключено.The DataKeys collection is stored in the GridView s control state, meaning that the DataKeys values will be remembered across postback even if the GridView s view state has been disabled. Однако очень важно, чтобы состояние представления оставалось включенным для элементов управления GridView, поддерживающих редактирование или удаление (поведение по умолчанию).However, it is very important that view state remains enabled for GridViews that support editing or deleting (the default behavior). Если для свойства EnableViewState GridView s задано значение false, то поведение редактирования и удаления будет работать для одного пользователя, но при наличии одновременных пользователей удаление данных существует вероятность того, что эти одновременные пользователи могут случайно удалить или изменить записи, которые им не планировалось.If you set the GridView s EnableViewState property to false, the editing and deleting behavior will work fine for a single user, but if there are concurrent users deleting data, there exists the possibility that these concurrent users may accidentally delete or edit records that they didn't intend. См. мою запись блога, Предупреждение: проблемы параллелизма с ASP.NET 2,0 gridviews/DetailsView/FormView, которые поддерживают редактирование и (или) удаление, а состояние представления — отключено, для получения дополнительных сведений.See my blog entry, WARNING: Concurrency Issue with ASP.NET 2.0 GridViews/DetailsView/FormViews that Support Editing and/or Deleting and Whose View State is Disabled, for more information.

Это же предупреждение также относится к DetailsView и FormView.This same warning also applies to DetailsViews and FormViews.

Чтобы добавить возможности удаления в GridView, просто перейдите к смарт-тегу и установите флажок Включить удаление.To add deleting capabilities to a GridView, simply go to its smart tag and check the Enable Deleting checkbox.

Установите флажок "включить удаление".

Рис. 10. Установка флажка "включить удаление"Figure 10: Check the Enable Deleting Checkbox

Установка флажка "включить удаление" из смарт-тега добавляет CommandField в GridView.Checking the Enable Deleting checkbox from the smart tag adds a CommandField to the GridView. CommandField визуализирует столбец в GridView с кнопками для выполнения одной или нескольких следующих задач: Выбор записи, изменение записи и удаление записи.The CommandField renders a column in the GridView with buttons for performing one or more of the following tasks: selecting a record, editing a record, and deleting a record. Ранее мы видели CommandField в действии с выбором записей в главной и подробной среде с помощью выбираемого главного элемента управления GridView с учебником Details DetailView .We previously saw the CommandField in action with selecting records in the Master/Detail Using a Selectable Master GridView with a Details DetailView tutorial.

CommandField содержит ряд свойств ShowXButton, которые указывают, какие ряды кнопок отображаются в CommandField.The CommandField contains a number of ShowXButton properties that indicate what series of buttons are displayed in the CommandField. Установив флажок Enable (включить удаление) CommandField, свойство ShowDeleteButton которого true, было добавлено в коллекцию Columns GridView.By checking the Enable Deleting checkbox a CommandField whose ShowDeleteButton property is true has been added to the GridView's Columns collection.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        ... BoundFields removed for brevity ...
    </Columns>
</asp:GridView>

На этом этапе вы считаете, что он или нет, мы сделали Добавление поддержки удаления в GridView!At this point, believe it or not, we're done with adding deleting support to the GridView! Как показано на рис. 11, при посещении этой страницы через браузер имеется столбец с кнопками «удалить».As Figure 11 shows, when visiting this page through a browser a column of Delete buttons is present.

CommandField добавляет столбец кнопок удаленияThe CommandField Adds a Column of Delete Buttons

Рис. 11. CommandField добавляет столбец кнопок удаления (щелкните, чтобы просмотреть изображение с полным размером)Figure 11: The CommandField Adds a Column of Delete Buttons (Click to view full-size image)

Если вы создаете этот учебник с нуля самостоятельно, при тестировании этой страницы нажатие кнопки удалить вызовет исключение.If you've been building this tutorial from the ground up on your own, when testing this page clicking the Delete button will raise an exception. Продолжайте чтение, чтобы узнать, почему были вызваны эти исключения и как их исправить.Continue reading to learn as to why these exceptions were raised and how to fix them.

Note

Если вы используете загрузку, прилагаемую к этому учебнику, эти проблемы уже были внесены в учетную запись.If you're following along using the download accompanying this tutorial, these problems have already been accounted for. Однако я рекомендую ознакомиться с приведенными ниже сведениями, чтобы определить проблемы, которые могут возникнуть и подходящие решения.However, I encourage you to read through the details listed below to help identify problems that may arise and suitable workarounds.

Если при попытке удалить продукт вы получаете исключение, сообщение о котором похоже на "ObjectDataSource ' ObjectDataSource1 ' не может найти неуниверсальный метод ' DeleteProduct ', имеющий параметры: ProductID, original_ProductID, вероятно, вы забыли удалить свойство OldValuesParameterFormatString из ObjectDataSource.If, when attempting to delete a product, you get an exception whose message is similar to "ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'DeleteProduct' that has parameters: productID, original_ProductID," you likely forgot to remove the OldValuesParameterFormatString property from the ObjectDataSource. Если указано свойство OldValuesParameterFormatString, ObjectDataSource пытается передать в метод DeleteProduct productID и original_ProductID входные параметры.With the OldValuesParameterFormatString property specified, the ObjectDataSource attempts to pass in both productID and original_ProductID input parameters to the DeleteProduct method. Однако DeleteProductпринимает только один входной параметр, поэтому это исключение.DeleteProduct, however, only accepts a single input parameter, hence the exception. Удаление свойства OldValuesParameterFormatString (или присвоение ему значения {0}) заставляет ObjectDataSource не пытаться передать исходный входной параметр.Removing the OldValuesParameterFormatString property (or setting it to {0}) instructs the ObjectDataSource to not attempt to pass in the original input parameter.

убедитесь, что свойство OldValuesParameterFormatString было удалено.Ensure That the OldValuesParameterFormatString Property Has Been Cleared Out

Рис. 12. Убедитесь, что свойство OldValuesParameterFormatString было удалено (щелкните, чтобы просмотреть изображение с полным размером)Figure 12: Ensure That the OldValuesParameterFormatString Property Has Been Cleared Out (Click to view full-size image)

Даже если вы удалили свойство OldValuesParameterFormatString, по-прежнему возникает исключение при попытке удалить продукт с сообщением: "инструкция DELETE конфликтует с ссылочным ограничением FK_Order_details_Products" . База данных Northwind содержит ограничение внешнего ключа между Order Details и Products таблицей, что означает, что продукт нельзя удалить из системы, если для него есть одна или несколько записей в таблице Order Details.Even if you had removed the OldValuesParameterFormatString property, you still will get an exception when trying to delete a product with the message: "The DELETE statement conflicted with the REFERENCE constraint 'FK_Order_Details_Products'." The Northwind database contains a foreign key constraint between the Order Details and Products table, meaning that a product cannot be deleted from the system if there are one or more records for it in the Order Details table. Так как каждый продукт в базе данных Northwind имеет по крайней мере одну запись в Order Details, мы не можем удалить какие бы то ни было продукты, пока не удалим соответствующие записи о заказах продукта.Since every product in the Northwind database has at least one record in Order Details, we cannot delete any products until we first delete the product's associated order details records.

ограничение внешнего ключа запрещает удаление продуктовA Foreign Key Constraint Prohibits the Deletion of Products

Рис. 13. ограничение внешнего ключа запрещает удаление продуктов (щелкните, чтобы просмотреть изображение с полным размером)Figure 13: A Foreign Key Constraint Prohibits the Deletion of Products (Click to view full-size image)

В нашем руководстве мы просто удалим все записи из таблицы Order Details.For our tutorial, let's just delete all of the records from the Order Details table. В реальном приложении необходимо выполнить одно из следующих действий:In a real-world application we'd need to either:

  • Наличие другого экрана для управления сведениями о заказахHave another screen to manage order details information
  • Расширение метода DeleteProduct для включения логики для удаления указанных сведений о заказе продуктаAugment the DeleteProduct method to include logic to delete the specified product's order details
  • Изменение SQL запроса, используемого TableAdapter для включения удаления указанных сведений о заказе продуктаModify the SQL query used by the TableAdapter to include deletion of the specified product's order details

Просто удалим все записи из таблицы Order Details, чтобы обойти ограничение внешнего ключа.Let's just delete all of the records from the Order Details table to circumvent the foreign key constraint. Перейдите в обозреватель сервера в Visual Studio, щелкните правой кнопкой мыши узел NORTHWND.MDF и выберите команду Создать запрос.Go to the Server Explorer in Visual Studio, right-click on the NORTHWND.MDF node, and choose New Query. Затем в окне запроса выполните следующую инструкцию SQL: DELETE FROM [Order Details]Then, in the query window, run the following SQL statement: DELETE FROM [Order Details]

удалить все записи из таблицы Order DetailsDelete All Records from the Order Details Table

Рис. 14. Удаление всех записей из таблицы Order Details (щелкните, чтобы просмотреть изображение с полным размером)Figure 14: Delete All Records from the Order Details Table (Click to view full-size image)

После очистки Order Details таблице нажатие кнопки удалить приведет к удалению продукта без ошибок.After clearing out the Order Details table clicking on the Delete button will delete the product without error. Если нажатие кнопки удалить не приводит к удалению продукта, убедитесь, что для свойства DataKeyNames GridView установлено значение поля первичный ключ (ProductID).If clicking on the Delete button does not delete the product, check to ensure that the GridView's DataKeyNames property is set to the primary key field (ProductID).

Note

При нажатии кнопки "Удалить" происходит обратная передача, и запись удаляется.When clicking on the Delete button a postback ensues and the record is deleted. Это может быть опасно, поскольку несложно случайно нажать кнопку "Удалить" в неверной строке.This can be dangerous since it is easy to accidentally click on the wrong row's Delete button. В следующем учебном курсе мы покажем, как добавить подтверждение на стороне клиента при удалении записи.In a future tutorial we'll see how to add a client-side confirmation when deleting a record.

Изменение данных с помощью GridViewEditing Data with the GridView

Вместе с удалением элемент управления GridView также предоставляет встроенную поддержку редактирования на уровне строк.Along with deleting, the GridView control also provides built-in row-level editing support. Настройка элемента управления GridView для поддержки редактирования добавляет столбец кнопок редактирования.Configuring a GridView to support editing adds a column of Edit buttons. С точки зрения конечного пользователя нажатие кнопки Правка строки приводит к тому, что эта строка становится редактируемой, а ячейки переходят в текстовые поля, содержащие существующие значения, и заменяют кнопку изменить кнопками обновления и отмены.From the end user's perspective, clicking a row's Edit button causes that row to become editable, turning the cells into textboxes containing the existing values and replacing the Edit button with Update and Cancel buttons. После внесения необходимых изменений конечный пользователь может нажать кнопку обновить, чтобы сохранить изменения, или кнопку Отмена, чтобы отменить их.After making their desired changes, the end user can click the Update button to commit the changes or the Cancel button to discard them. В любом случае после нажатия кнопки Обновить или отмена GridView возвращается в состояние предварительного редактирования.In either case, after clicking Update or Cancel the GridView returns to its pre-editing state.

С нашей точки зрения разработчик страницы, когда пользователь нажимает кнопку "Изменить" для определенной строки, выполняется обратная передача, и GridView выполняет следующие действия:From our perspective as the page developer, when the end user clicks the Edit button for a particular row, a postback ensues and the GridView performs the following steps:

  1. Свойство EditItemIndex GridView присвоено индексу строки, для которой была нажата кнопка "Изменить"The GridView's EditItemIndex property is assigned to the index of the row whose Edit button was clicked
  2. Элемент управления GridView повторно привязывается к ObjectDataSource, вызывая метод Select()The GridView rebinds itself to the ObjectDataSource by invoking its Select() method
  3. Индекс строки, соответствующий EditItemIndex, подготавливается к просмотру в режиме правки.The row index that matches the EditItemIndex is rendered in "edit mode." В этом режиме кнопка "Изменить" заменяется кнопками обновления и отмены и BoundFields, свойства ReadOnly которых имеют значение false (по умолчанию), отображаются как веб-элементы управления TextBox, Text свойства которых присваиваются значениям полей данных.In this mode, the Edit button is replaced by Update and Cancel buttons and BoundFields whose ReadOnly properties are False (the default) are rendered as TextBox Web controls whose Text properties are assigned to the data fields' values.

На этом этапе в браузер возвращается разметка, позволяющая конечному пользователю вносить любые изменения в данные строки.At this point the markup is returned to the browser, allowing the end user to make any changes to the row's data. Когда пользователь нажимает кнопку "Обновить", происходит обратная передача, и GridView выполняет следующие действия:When the user clicks the Update button, a postback occurs and the GridView performs the following steps:

  1. UpdateParameters значениям ObjectDataSource присваиваются значения, вводимых конечным пользователем в интерфейс редактирования GridView.The ObjectDataSource's UpdateParameters value(s) are assigned the values entered by the end user into the GridView's editing interface
  2. Вызывается метод Update() ObjectDataSource, который обновляет указанную записьThe ObjectDataSource's Update() method is invoked, updating the specified record
  3. Элемент управления GridView повторно привязывается к ObjectDataSource, вызывая метод Select()The GridView rebinds itself to the ObjectDataSource by invoking its Select() method

Значения первичного ключа, назначенные UpdateParameters на шаге 1, берутся из значений, указанных в свойстве DataKeyNames, тогда как значения непервичного ключа берутся из текста в веб-элементах управления TextBox для редактируемой строки.The primary key values assigned to the UpdateParameters in Step 1 come from the values specified in the DataKeyNames property, whereas the non-primary key values come from the text in the TextBox Web controls for the edited row. Как и при удалении, крайне важно, чтобы свойство DataKeyNames GridView было правильно установлено.As with deleting, it is vital that a GridView's DataKeyNames property be correctly set. Если он отсутствует, UpdateParameters значение первичного ключа будет присвоено null значению на шаге 1, что, в свою очередь, не приведет к обновлению записей на шаге 2.If it's missing, the UpdateParameters primary key value will be assigned a null value in Step 1, which in turn will not result in any updated records in Step 2.

Функциональность редактирования можно активировать, просто установив флажок Включить редактирование в смарт-теге GridView.Editing functionality can be activated by simply checking the Enable Editing checkbox in the GridView's smart tag.

Установите флажок Enable Edit (включить редактирование).

Рис. 15. Установка флажка "включить редактирование"Figure 15: Check the Enable Editing Checkbox

Установка флажка Enable Edit (включить редактирование) добавит CommandField (при необходимости) и присвойте свойству ShowEditButton значение true.Checking the Enable Editing checkbox will add a CommandField (if needed) and set its ShowEditButton property to true. Как мы видели ранее, CommandField содержит ряд свойств ShowXButton, которые указывают, какие серии кнопок отображаются в CommandField.As we saw earlier, the CommandField contains a number of ShowXButton properties that indicate what series of buttons are displayed in the CommandField. Установив флажок Enable Edit (включить редактирование), вы добавите свойство ShowEditButton к существующему CommandField:Checking the Enable Editing checkbox adds the ShowEditButton property to the existing CommandField:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" />
        ... BoundFields removed for brevity ...
    </Columns>
</asp:GridView>

Это все, что необходимо для добавления поддержки элементарного редактирования.That's all there is to adding rudimentary editing support. Как показано в Figure16, интерфейс правки грубый каждый BoundField, свойство ReadOnly которого имеет значение false (значение по умолчанию) подготавливается к просмотру как текстовое поле.As Figure16 shows, the editing interface is rather crude each BoundField whose ReadOnly property is set to false (the default) is rendered as a TextBox. Сюда входят такие поля, как CategoryID и SupplierID, которые являются ключами к другим таблицам.This includes fields like CategoryID and SupplierID, which are keys to other tables.

нажатии кнопки "Изменить" в списке Chai s отображает строку в режиме редактированияClicking Chai s Edit Button Displays the Row in Edit Mode

Рис. 16. нажатие кнопки "Изменить" в списке Chai s отображает строку в режиме редактирования (щелкните, чтобы просмотреть изображение с полным размером)Figure 16: Clicking Chai s Edit Button Displays the Row in Edit Mode (Click to view full-size image)

Помимо предоставления пользователям возможности изменять значения внешних ключей напрямую, интерфейс интерфейса правки не имеет следующих отличий.In addition to asking users to edit foreign key values directly, the editing interface's interface is lacking in the following ways:

  • Если пользователь вводит CategoryID или SupplierID, которых нет в базе данных, UPDATE будет нарушать ограничение внешнего ключа, что приведет к возникновению исключения.If the user enters a CategoryID or SupplierID that does not exist in the database, the UPDATE will violate a foreign key constraint, causing an exception to be raised.
  • Интерфейс редактирования не включает проверку.The editing interface doesn't include any validation. Если не указано требуемое значение (например, ProductName) или введите строковое значение, в котором ожидается числовое значение (например, введите "слишком много!").If you don't provide a required value (such as ProductName), or enter a string value where a numeric value is expected (such as entering "Too much!" в текстовое поле UnitPrice) будет создано исключение.into the UnitPrice textbox), an exception will be thrown. В следующем учебнике будет рассмотрено Добавление элементов управления проверки в пользовательский интерфейс редактирования.A future tutorial will examine how to add validation controls to the editing user interface.
  • Сейчас все поля продуктов, которые не предназначены только для чтения, должны быть включены в GridView.Currently, all product fields that are not read-only must be included in the GridView. Если бы было необходимо удалить поле из GridView, скажем UnitPrice, при обновлении данных GridView не задаст значение UnitPrice UpdateParameters, что привело бы к изменению UnitPrice записи базы данных на NULL значение.If we were to remove a field from the GridView, say UnitPrice, when updating the data the GridView would not set the UnitPrice UpdateParameters value, which would change the database record's UnitPrice to a NULL value. Аналогичным образом, если обязательное поле, например ProductName, удаляется из GridView, обновление завершится ошибкой с тем же «Column ' ProductName ' не допускает значения NULL», упомянутого выше.Similarly, if a required field, such as ProductName, is removed from the GridView, the update will fail with the same "Column 'ProductName' does not allow nulls" exception mentioned above.
  • Форматирование интерфейса редактирования оставляет массу необходимости.The editing interface formatting leaves a lot to be desired. UnitPrice отображается с четырьмя десятичными точками.The UnitPrice is shown with four decimal points. В идеале значения CategoryID и SupplierID будут содержать элементов управления DropDownList, в которых перечислены категории и поставщики в системе.Ideally the CategoryID and SupplierID values would contain DropDownLists that list the categories and suppliers in the system.

Это все недостатки, с которыми мы будем жить сейчас, но они будут рассмотрены в следующих руководствах.These are all shortcomings that we'll have to live with for now, but will be addressed in future tutorials.

Вставка, изменение и удаление данных с помощью элемента DetailsViewInserting, Editing, and Deleting Data with the DetailsView

Как мы видели в предыдущих учебных курсах, элемент управления DetailsView отображает по одной записи за раз и, как GridView, позволяет изменять и удалять отображаемую в данный момент запись.As we've seen in earlier tutorials, the DetailsView control displays one record at a time and, like the GridView, allows for editing and deleting of the currently displayed record. Опыт конечного пользователя, редактирующий и удаляющий элементы из элемента DetailsView и рабочего процесса из ASP.NET, идентичен элементу GridView.Both the end user's experience with editing and deleting items from a DetailsView and the workflow from the ASP.NET side is identical to that of the GridView. Если элемент DetailsView отличается от GridView, он также предоставляет встроенную поддержку вставки.Where the DetailsView differs from the GridView is that it also provides built-in inserting support.

Чтобы продемонстрировать возможности изменения данных GridView, начните с добавления элемента DetailsView на страницу Basics.aspx над существующим элементом управления GridView и привяжите его к существующему ObjectDataSource через смарт-тег DetailsView.To demonstrate the data modification capabilities of the GridView, start by adding a DetailsView to the Basics.aspx page above the existing GridView and bind it to the existing ObjectDataSource through the DetailsView's smart tag. Затем очистите свойства Height и Width DetailsView, а также установите флажок Включить разбиение по страницам в смарт-теге.Next, clear out the DetailsView's Height and Width properties, and check the Enable Paging option from the smart tag. Чтобы включить поддержку редактирования, вставки и удаления, просто установите флажки Включить редактирование, включить вставку и включить удаление в смарт-теге.To enable editing, inserting, and deleting support, simply check the Enable Editing, Enable Inserting, and Enable Deleting checkboxes in the smart tag.

Настройка элемента DetailsView для поддержки редактирования, вставки и удаления

Рис. 17. Настройка DetailsView для поддержки редактирования, вставки и удаленияFigure 17: Configure the DetailsView to Support Editing, Inserting, and Deleting

Как и в случае с GridView, Добавление поддержки правки, вставки или удаления добавляет CommandField к элементу DetailsView, как показано в следующем декларативном синтаксисе:As with the GridView, adding editing, inserting, or deleting support adds a CommandField to the DetailsView, as the following declarative syntax shows:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" AllowPaging="True">
    <Fields>
        <asp:BoundField DataField="ProductID"
            HeaderText="ProductID" InsertVisible="False"
            ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName"
            HeaderText="ProductName" SortExpression="ProductName" />
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
            SortExpression="CategoryID" />
        <asp:BoundField DataField="QuantityPerUnit"
            HeaderText="QuantityPerUnit"
            SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice"
            HeaderText="UnitPrice" SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
            HeaderText="UnitsInStock" SortExpression="UnitsInStock" />
        <asp:BoundField DataField="UnitsOnOrder"
            HeaderText="UnitsOnOrder" SortExpression="UnitsOnOrder" />
        <asp:BoundField DataField="ReorderLevel"
            HeaderText="ReorderLevel" SortExpression="ReorderLevel" />
        <asp:CheckBoxField DataField="Discontinued"
            HeaderText="Discontinued" SortExpression="Discontinued" />
        <asp:BoundField DataField="CategoryName"
            HeaderText="CategoryName" ReadOnly="True"
            SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
            HeaderText="SupplierName" ReadOnly="True"
            SortExpression="SupplierName" />
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" ShowInsertButton="True" />
    </Fields>
</asp:DetailsView>

Обратите внимание, что для DetailsView CommandField по умолчанию отображается в конце коллекции Columns.Note that for the DetailsView the CommandField appears at the end of the Columns collection by default. Поскольку поля DetailsView подготавливаются к просмотру как строки, CommandField отображается в виде строки с кнопками вставки, правки и удаления в нижней части элемента DetailsView.Since the DetailsView's fields are rendered as rows, the CommandField appears as a row with Insert, Edit, and Delete buttons at the bottom of the DetailsView.

настроить DetailsView для поддержки редактирования, вставки и удаленияConfigure the DetailsView to Support Editing, Inserting, and Deleting

Рис. 18. Настройка элемента DetailsView для поддержки редактирования, вставки и удаления (щелкните, чтобы просмотреть изображение с полным размером)Figure 18: Configure the DetailsView to Support Editing, Inserting, and Deleting (Click to view full-size image)

При нажатии кнопки "Удалить" начинается та же последовательность событий, что и для GridView: обратная передача. после чего элемент управления DetailsView заполняет DeleteParameters на основе значений DataKeyNames; и завершился с вызовом метода Delete() ObjectDataSource, который фактически удаляет продукт из базы данных.Clicking on the Delete button starts the same sequence of events as with the GridView: a postback; followed by the DetailsView populating its ObjectDataSource's DeleteParameters based on the DataKeyNames values; and completed with a call its ObjectDataSource's Delete() method, which actually removes the product from the database. Редактирование в DetailsView также работает точно так же, как GridView.Editing in the DetailsView also works in a fashion identical to that of the GridView.

Для вставки конечного пользователя отображается новая кнопка, которая при нажатии отображает DetailsView в режиме вставки.For inserting, the end user is presented with a New button that, when clicked, renders the DetailsView in "insert mode." При использовании "режима вставки" Новая кнопка заменяется кнопками вставки и отмены и только те BoundFields, для которых свойство InsertVisible имеет значение true (по умолчанию).With "insert mode" the New button is replaced by Insert and Cancel buttons and only those BoundFields whose InsertVisible property is set to true (the default) are displayed. Эти поля данных, идентифицируемые как поля автоприращения, такие как ProductID, имеют свойство инсертвисибле со значением false при привязке элемента DetailsView к источнику данных через смарт-тег.Those data fields identified as auto-increment fields, such as ProductID, have their InsertVisible property set to false when binding the DetailsView to the data source through the smart tag.

При привязке источника данных к элементу DetailsView через смарт-тег Visual Studio устанавливает свойство InsertVisible в значение false только для полей автоприращения.When binding a data source to a DetailsView through the smart tag, Visual Studio sets the InsertVisible property to false only for auto-increment fields. Поля, предназначенные только для чтения, такие как CategoryName и SupplierName, будут отображаться в пользовательском интерфейсе "режим вставки", если только для свойства InsertVisible явно не задано значение false.Read-only fields, like CategoryName and SupplierName, will be displayed in the "insert mode" user interface unless their InsertVisible property is explicitly set to false. Потратьте немного времени, чтобы задать для этих двух полей InsertVisible свойства false, с помощью декларативного синтаксиса DetailsView или ссылки Edit Fields (изменить поля) в смарт-теге.Take a moment to set these two fields' InsertVisible properties to false, either through the DetailsView's declarative syntax or through the Edit Fields link in the smart tag. На рис. 19 показано, как задать свойства InsertVisible для false, щелкнув ссылку Edit Fields (изменить поля).Figure 19 shows setting the InsertVisible properties to false by clicking on the Edit Fields link.

Northwind Traders теперь предлагает ACME чайNorthwind Traders Now Offers Acme Tea

Рис. 19. Теперь компания Northwind Traders предлагает ACME-чай (щелкните, чтобы просмотреть изображение полного размера)Figure 19: Northwind Traders Now Offers Acme Tea (Click to view full-size image)

После задания свойств InsertVisible просмотрите страницу Basics.aspx в браузере и нажмите кнопку Создать.After setting the InsertVisible properties, view the Basics.aspx page in a browser and click the New button. На рис. 20 показана DetailsView при добавлении нового напитков, Acme чай в нашу линейку продуктов.Figure 20 shows the DetailsView when adding a new beverage, Acme Tea, to our product line.

Northwind Traders теперь предлагает ACME чайNorthwind Traders Now Offers Acme Tea

Рис. 20. Теперь компания Northwind Traders предлагает ACME чай (щелкните, чтобы просмотреть изображение с полным размером)Figure 20: Northwind Traders Now Offers Acme Tea (Click to view full-size image)

После ввода сведений для «Acme» и нажатия кнопки «Вставить» происходит обратная передача, а новая запись добавляется в таблицу базы данных Products.After entering the details for Acme Tea and clicking the Insert button, a postback ensues and the new record is added to the Products database table. Так как эта DetailsView перечисляет продукты в порядке, в котором они существуют в таблице базы данных, для просмотра нового продукта необходимо выполнить страницу до последнего продукта.Since this DetailsView lists the products in order with which they exist in the database table, we must page to the last product in order to see the new product.

сведения о чайDetails for Acme Tea

Рисунок 21. сведения для «Acme» (щелкните, чтобы просмотреть изображение с полным размером)Figure 21: Details for Acme Tea (Click to view full-size image)

Note

Свойство куррентмоде элемента DetailsView указывает отображаемый интерфейс и может принимать одно из следующих значений: Edit, Insertили ReadOnly.The DetailsView's CurrentMode property indicates the interface being displayed and can be one of the following values: Edit, Insert, or ReadOnly. Свойство DefaultMode указывает режим, в который элемент DetailsView возвращает значение после завершения операции правки или вставки. он удобен для отображения элемента DetailsView, который постоянно находится в режиме правки или вставки.The DefaultMode property indicates the mode the DetailsView returns to after an edit or insert has been completed and is useful for displaying a DetailsView that is permanently in edit or insert mode.

Точка и щелчок функции вставки и правки элемента управления DetailsView пострадает от тех же ограничений, что и GridView: пользователь должен ввести существующие CategoryID и SupplierID значения через текстовое поле. в интерфейсе отсутствует логика проверки. все поля продуктов, которые не допускают NULL значений или не имеют значения по умолчанию, заданного на уровне базы данных, должны быть включены в интерфейс вставки и т. д.The point and click inserting and editing capabilities of the DetailsView suffer from the same limitations as the GridView: the user must enter existing CategoryID and SupplierID values through a textbox; the interface lacks any validation logic; all product fields that do not allow NULL values or don't have a default value specified at the database level must be included in the inserting interface, and so on.

Методы, которые мы рассмотрим для расширения и улучшения интерфейса редактирования GridView в будущих статьях, можно также применить к интерфейсам правки и вставки элемента управления DetailsView.The techniques we will examine for extending and enhancing the GridView's editing interface in future articles can be applied to the DetailsView control's editing and inserting interfaces as well.

Использование элемента FormView для более гибкого пользовательского интерфейса изменения данныхUsing the FormView for a More Flexible Data Modification User Interface

FormView предлагает встроенную поддержку вставки, редактирования и удаления данных, но поскольку в ней используются шаблоны вместо полей, нет места для добавления BoundFields или CommandField, используемых элементами управления GridView и DetailsView для предоставления данных. интерфейс изменения.The FormView offers built-in support for inserting, editing, and deleting data, but because it uses templates instead of fields there's no place to add the BoundFields or the CommandField used by the GridView and DetailsView controls to provide the data modification interface. Вместо этого интерфейс веб-элементов управления для сбора вводимых пользователем данных при добавлении нового элемента или редактировании существующего объекта вместе с кнопками создать, изменить, удалить, вставить, обновить и отменить необходимо вручную добавить в соответствующие шаблоны.Instead, this interface the Web controls for collecting user input when adding a new item or editing an existing one along with the New, Edit, Delete, Insert, Update, and Cancel buttons must be added manually to the appropriate templates. К счастью, Visual Studio автоматически создаст необходимый интерфейс при привязке элемента FormView к источнику данных с помощью раскрывающегося списка в смарт-теге.Fortunately, Visual Studio will automatically create the needed interface when binding the FormView to a data source through the drop-down list in its smart tag.

Чтобы продемонстрировать эти методы, начните с добавления элемента управления FormView на страницу Basics.aspx и из смарт-тега FormView привяжите его к уже созданному ObjectDataSource.To illustrate these techniques, start by adding a FormView to the Basics.aspx page and, from the FormView's smart tag, bind it to the ObjectDataSource already created. Это приведет к созданию EditItemTemplate, InsertItemTemplateи ItemTemplate для элемента управления FormView с TextBox для получения веб-элементов управления ввода и кнопок пользователя для кнопок создать, изменить, удалить, вставить, обновить и отменить.This will generate an EditItemTemplate, InsertItemTemplate, and ItemTemplate for the FormView with TextBox Web controls for collecting the user's input and Button Web controls for the New, Edit, Delete, Insert, Update, and Cancel buttons. Кроме того, для свойства DataKeyNames FormView задается поле первичного ключа (ProductID) объекта, возвращаемого ObjectDataSource.Additionally, the FormView's DataKeyNames property is set to the primary key field (ProductID) of the object returned by the ObjectDataSource. Наконец, установите флажок Включить разбиение по страницам в смарт-теге FormView.Lastly, check the Enable Paging option in the FormView's smart tag.

Ниже показана декларативная разметка для ItemTemplate FormView после привязки элемента управления FormView к ObjectDataSource.The following shows the declarative markup for the FormView's ItemTemplate after the FormView has been bound to the ObjectDataSource. По умолчанию каждое поле продукта, не являющегося логическим значением, привязано к свойству Text элемента управления Label, тогда как каждое поле логического значения (Discontinued) привязано к свойству Checked отключенного веб-элемента управления CheckBox.By default, each non-Boolean value product field is bound to the Text property of a Label Web control while each Boolean value field (Discontinued) is bound to the Checked property of a disabled CheckBox Web control. Чтобы кнопки создания, изменения и удаления вызывали определенное поведение FormView при щелчке, необходимо установить для их CommandName значения New, Editи Deleteсоответственно.In order for the New, Edit, and Delete buttons to trigger certain FormView behavior when clicked, it is imperative that their CommandName values be set to New, Edit, and Delete, respectively.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ...
    </EditItemTemplate>
    <InsertItemTemplate>
        ...
    </InsertItemTemplate>
    <ItemTemplate>
        ProductID:
        <asp:Label ID="ProductIDLabel" runat="server"
            Text='<%# Eval("ProductID") %>'></asp:Label><br />
        ProductName:
        <asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Bind("ProductName") %>'>
        </asp:Label><br />
        SupplierID:
        <asp:Label ID="SupplierIDLabel" runat="server"
            Text='<%# Bind("SupplierID") %>'>
        </asp:Label><br />
        CategoryID:
        <asp:Label ID="CategoryIDLabel" runat="server"
            Text='<%# Bind("CategoryID") %>'>
        </asp:Label><br />
        QuantityPerUnit:
        <asp:Label ID="QuantityPerUnitLabel" runat="server"
            Text='<%# Bind("QuantityPerUnit") %>'>
        </asp:Label><br />
        UnitPrice:
        <asp:Label ID="UnitPriceLabel" runat="server"
            Text='<%# Bind("UnitPrice") %>'></asp:Label><br />
        UnitsInStock:
        <asp:Label ID="UnitsInStockLabel" runat="server"
            Text='<%# Bind("UnitsInStock") %>'>
        </asp:Label><br />
        UnitsOnOrder:
        <asp:Label ID="UnitsOnOrderLabel" runat="server"
            Text='<%# Bind("UnitsOnOrder") %>'>
        </asp:Label><br />
        ReorderLevel:
        <asp:Label ID="ReorderLevelLabel" runat="server"
            Text='<%# Bind("ReorderLevel") %>'>
        </asp:Label><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
            Checked='<%# Bind("Discontinued") %>'
            Enabled="false" /><br />
        CategoryName:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Bind("CategoryName") %>'>
        </asp:Label><br />
        SupplierName:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Bind("SupplierName") %>'>
        </asp:Label><br />
        <asp:LinkButton ID="EditButton" runat="server"
            CausesValidation="False" CommandName="Edit"
            Text="Edit">
        </asp:LinkButton>
        <asp:LinkButton ID="DeleteButton" runat="server"
            CausesValidation="False" CommandName="Delete"
            Text="Delete">
        </asp:LinkButton>
        <asp:LinkButton ID="NewButton" runat="server"
            CausesValidation="False" CommandName="New"
            Text="New">
        </asp:LinkButton>
    </ItemTemplate>
</asp:FormView>

На рис. 22 показано ItemTemplate FormView при просмотре в браузере.Figure 22 shows the FormView's ItemTemplate when viewed through a browser. Каждое поле продукта отображается с кнопками создать, изменить и удалить внизу.Each product field is listed with the New, Edit, and Delete buttons at the bottom.

Дефаут FormView ItemTemplate содержит список всех полей продуктов, а также кнопки "создать", "Изменить" и "Удалить".The Defaut FormView ItemTemplate Lists Each Product Field Along with New, Edit, and Delete Buttons

Рис. 22. дефаут FormView ItemTemplate список всех полей продуктов вместе с кнопками "создать", "Изменить" и "Удалить" (щелкните, чтобы просмотреть изображение с полным размером)Figure 22: The Defaut FormView ItemTemplate Lists Each Product Field Along with New, Edit, and Delete Buttons (Click to view full-size image)

Как и в случае с GridView и DetailsView, нажатием кнопки удалить или любой кнопкой, LinkButton или ImageButton, свойство CommandName которого имеет значение Delete, вызывает обратную передачу, заполняет DeleteParameters ObjectDataSource на основе значения DataKeyNames FormView и вызывает метод Delete() ObjectDataSource.Like with the GridView and DetailsView, clicking the Delete button or any Button, LinkButton, or ImageButton whose CommandName property is set to Delete causes a postback, populates the ObjectDataSource's DeleteParameters based on the FormView's DataKeyNames value, and invokes the ObjectDataSource's Delete() method.

При нажатии кнопки "Изменить" происходит обратная передача данных, и данные повторно привязываются к EditItemTemplate, которая отвечает за визуализацию интерфейса редактирования.When the Edit button is clicked a postback ensues and the data is rebound to the EditItemTemplate, which is responsible for rendering the editing interface. Этот интерфейс включает веб-элементы управления для редактирования данных вместе с кнопками обновления и отмены.This interface includes the Web controls for editing data along with the Update and Cancel buttons. EditItemTemplate по умолчанию, создаваемая Visual Studio, содержит метку для всех полей автоприращения (ProductID), текстовое поле для каждого поля значения, не являющегося логическим, и флажок для каждого поля логического значения.The default EditItemTemplate generated by Visual Studio contains a Label for any auto-increment fields (ProductID), a TextBox for each non-Boolean value field, and a CheckBox for each Boolean value field. Такое поведение очень похоже на автоматическое создание BoundFields в элементах управления GridView и DetailsView.This behavior is very similar to the auto-generated BoundFields in the GridView and DetailsView controls.

Note

Одной из мелких проблем с автосозданием EditItemTemplate FormView является то, что она отображает веб-элементы управления TextBox для полей, доступных только для чтения, таких как CategoryName и SupplierName.One small issue with the FormView's auto-generation of the EditItemTemplate is that it renders TextBox Web controls for those fields that are read-only, such as CategoryName and SupplierName. В ближайшее время мы увидим, как это учитывать.We'll see how to account for this shortly.

Элементы управления TextBox в EditItemTemplate имеют свойства Text, привязанные к значению соответствующего поля данных с помощью двухсторонней привязки.The TextBox controls in the EditItemTemplate have their Text property bound to the value of their corresponding data field using two-way databinding. Двусторонняя привязка, обозначенная <%# Bind("dataField") %>, выполняет привязку данных как при привязке к шаблону, так и при заполнении параметров ObjectDataSource для вставки или изменения записей.Two-way databinding, denoted by <%# Bind("dataField") %>, performs databinding both when binding data to the template and when populating the ObjectDataSource's parameters for inserting or editing records. То есть когда пользователь нажимает кнопку "Изменить" в ItemTemplate, метод Bind() возвращает указанное значение поля данных.That is, when the user clicks the Edit button from the ItemTemplate, the Bind() method returns the specified data field value. После того как пользователь вносит изменения и нажимает кнопку обновить, значения, соответствующие полям данных, указанным с помощью Bind(), применяются к UpdateParametersу ObjectDataSource.After the user makes their changes and clicks Update, the values posted back that correspond to the data fields specified using Bind() are applied to the ObjectDataSource's UpdateParameters. Кроме того, односторонняя привязка, обозначающая <%# Eval("dataField") %>, извлекает значения полей данных только при привязке данных к шаблону и не возвращает значения, вводимых пользователем, в параметры источника данных при обратной передаче.Alternatively, one-way databinding, denoted by <%# Eval("dataField") %>, only retrieves the data field values when binding data to the template and does not return the user-entered values to the data source's parameters on postback.

В следующей декларативной разметке показано EditItemTemplateFormView.The following declarative markup shows the FormView's EditItemTemplate. Обратите внимание, что метод Bind() используется в синтаксисе привязки данных, и для веб-элементов управления "обновление" и "Отмена" заданы соответствующие свойства CommandName.Note that the Bind() method is used in the databinding syntax here and that the Update and Cancel Button Web controls have their CommandName properties set accordingly.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ProductID:
        <asp:Label ID="ProductIDLabel1" runat="server"
          Text="<%# Eval("ProductID") %>"></asp:Label><br />
        ProductName:
        <asp:TextBox ID="ProductNameTextBox" runat="server"
          Text="<%# Bind("ProductName") %>">
        </asp:TextBox><br />
        SupplierID:
        <asp:TextBox ID="SupplierIDTextBox" runat="server"
          Text="<%# Bind("SupplierID") %>">
        </asp:TextBox><br />
        CategoryID:
        <asp:TextBox ID="CategoryIDTextBox" runat="server"
          Text="<%# Bind("CategoryID") %>">
        </asp:TextBox><br />
        QuantityPerUnit:
        <asp:TextBox ID="QuantityPerUnitTextBox" runat="server"
           Text="<%# Bind("QuantityPerUnit") %>">
        </asp:TextBox><br />
        UnitPrice:
        <asp:TextBox ID="UnitPriceTextBox" runat="server"
           Text="<%# Bind("UnitPrice") %>">
        </asp:TextBox><br />
        UnitsInStock:
        <asp:TextBox ID="UnitsInStockTextBox" runat="server"
           Text="<%# Bind("UnitsInStock") %>">
        </asp:TextBox><br />
        UnitsOnOrder:
        <asp:TextBox ID="UnitsOnOrderTextBox" runat="server"
           Text="<%# Bind("UnitsOnOrder") %>">
        </asp:TextBox><br />
        ReorderLevel:
        <asp:TextBox ID="ReorderLevelTextBox" runat="server"
           Text="<%# Bind("ReorderLevel") %>">
        </asp:TextBox><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
            Checked="<%# Bind("Discontinued") %>" /><br />
        CategoryName:
        <asp:TextBox ID="CategoryNameTextBox" runat="server"
             Text="<%# Bind("CategoryName") %>">
        </asp:TextBox><br />
        SupplierName:
        <asp:TextBox ID="SupplierNameTextBox" runat="server"
             Text="<%# Bind("SupplierName") %>">
        </asp:TextBox><br />
        <asp:LinkButton ID="UpdateButton" runat="server"
            CausesValidation="True" CommandName="Update"
            Text="Update">
        </asp:LinkButton>
        <asp:LinkButton ID="UpdateCancelButton" runat="server"
            CausesValidation="False" CommandName="Cancel"
            Text="Cancel">
        </asp:LinkButton>
    </EditItemTemplate>
    <InsertItemTemplate>
        ...
    </InsertItemTemplate>
    <ItemTemplate>
        ...
    </ItemTemplate>
</asp:FormView>

На этом этапе наш EditItemTemplateвызовет исключение при попытке использовать его.Our EditItemTemplate, at this point, will cause an exception to be thrown if we attempt to use it. Проблема заключается в том, что поля CategoryName и SupplierName отображаются как веб-элементы управления TextBox в EditItemTemplate.The problem is that the CategoryName and SupplierName fields are rendered as TextBox Web controls in the EditItemTemplate. Необходимо изменить эти текстовые поля на метки или полностью удалить их.We either need to change these TextBoxes to Labels or remove them altogether. Давайте просто удалим их полностью из EditItemTemplate.Let's simply delete them entirely from the EditItemTemplate.

На рис. 23 показан элемент FormView в браузере после нажатия кнопки Edit (изменить) для Chai.Figure 23 shows the FormView in a browser after the Edit button has been clicked for Chai. Обратите внимание, что поля SupplierName и CategoryName, показанные в ItemTemplate, больше не существуют, так как они были удалены из EditItemTemplate.Note that the SupplierName and CategoryName fields shown in the ItemTemplate are no longer present, as we just removed them from the EditItemTemplate. При нажатии кнопки "перейти" FormView выполняет ту же последовательность шагов, что и элементы управления GridView и DetailsView.When the Update button is clicked the FormView proceeds through the same sequence of steps as the GridView and DetailsView controls.

по умолчанию в EditItemTemplate показывается каждое редактируемое поле продукта в виде текстового поля или флажкаBy Default the EditItemTemplate Shows Each Editable Product Field as a TextBox or CheckBox

Рис. 23. по умолчанию в EditItemTemplate отображаются все редактируемые поля продуктов в виде текстового поля или флажка (щелкните, чтобы просмотреть изображение с полным размером).Figure 23: By Default the EditItemTemplate Shows Each Editable Product Field as a TextBox or CheckBox (Click to view full-size image)

Когда вы нащелкнули кнопку "вставить", ItemTemplate подается обратная передача.When the Insert button is clicked the FormView's ItemTemplate a postback ensues. Однако данные не привязаны к элементу FormView, так как добавляется новая запись.However, no data is bound to the FormView because a new record is being added. Интерфейс InsertItemTemplate включает веб-элементы управления для добавления новой записи вместе с кнопками вставки и отмены.The InsertItemTemplate interface includes the Web controls for adding a new record along with the Insert and Cancel buttons. InsertItemTemplate по умолчанию, создаваемая Visual Studio, содержит текстовое поле для каждого поля значения, не являющегося логическим, и флажок для каждого поля логического значения, аналогично автоматически созданному интерфейсу EditItemTemplate.The default InsertItemTemplate generated by Visual Studio contains a TextBox for each non-Boolean value field and a CheckBox for each Boolean value field, similar to the auto-generated EditItemTemplate's interface. Элементы управления TextBox имеют свойство Text, привязанное к значению соответствующего поля данных, используя двустороннюю привязку данных.The TextBox controls have their Text property bound to the value of their corresponding data field using two-way databinding.

В следующей декларативной разметке показано InsertItemTemplateFormView.The following declarative markup shows the FormView's InsertItemTemplate. Обратите внимание, что метод Bind() используется в синтаксисе привязки данных, и для веб-элементов управления "Вставка" и "Отмена" заданы соответствующие свойства CommandName.Note that the Bind() method is used in the databinding syntax here and that the Insert and Cancel Button Web controls have their CommandName properties set accordingly.

<asp:FormView ID="FormView1" runat="server" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" AllowPaging="True">
    <EditItemTemplate>
        ...
    </EditItemTemplate>
    <InsertItemTemplate>
        ProductName:
        <asp:TextBox ID="ProductNameTextBox" runat="server"
           Text="<%# Bind("ProductName") %>">
        </asp:TextBox><br />
        SupplierID:
        <asp:TextBox ID="SupplierIDTextBox" runat="server"
           Text="<%# Bind("SupplierID") %>">
        </asp:TextBox><br />
        CategoryID:
        <asp:TextBox ID="CategoryIDTextBox" runat="server"
           Text="<%# Bind("CategoryID") %>">
        </asp:TextBox><br />
        QuantityPerUnit:
        <asp:TextBox ID="QuantityPerUnitTextBox" runat="server"
           Text="<%# Bind("QuantityPerUnit") %>">
        </asp:TextBox><br />
        UnitPrice:
        <asp:TextBox ID="UnitPriceTextBox" runat="server"
           Text="<%# Bind("UnitPrice") %>">
        </asp:TextBox><br />
        UnitsInStock:
        <asp:TextBox ID="UnitsInStockTextBox" runat="server"
           Text="<%# Bind("UnitsInStock") %>">
        </asp:TextBox><br />
        UnitsOnOrder:
        <asp:TextBox ID="UnitsOnOrderTextBox" runat="server"
           Text="<%# Bind("UnitsOnOrder") %>">
        </asp:TextBox><br />
        ReorderLevel:
        <asp:TextBox ID="ReorderLevelTextBox" runat="server"
           Text="<%# Bind("ReorderLevel") %>">
        </asp:TextBox><br />
        Discontinued:
        <asp:CheckBox ID="DiscontinuedCheckBox" runat="server"
           Checked="<%# Bind("Discontinued") %>" /><br />
        CategoryName:
        <asp:TextBox ID="CategoryNameTextBox" runat="server"
            Text="<%# Bind("CategoryName") %>">
        </asp:TextBox><br />
        SupplierName:
        <asp:TextBox ID="SupplierNameTextBox" runat="server"
           Text="<%# Bind("SupplierName") %>">
        </asp:TextBox><br />
        <asp:LinkButton ID="InsertButton" runat="server"
            CausesValidation="True" CommandName="Insert"
            Text="Insert">
        </asp:LinkButton>
        <asp:LinkButton ID="InsertCancelButton" runat="server"
            CausesValidation="False" CommandName="Cancel"
            Text="Cancel">
        </asp:LinkButton>
    </InsertItemTemplate>
    <ItemTemplate>
        ...
    </ItemTemplate>
</asp:FormView>

Существует тонкость автоматического создания InsertItemTemplateв FormView.There's a subtlety with the FormView's auto-generation of the InsertItemTemplate. В частности, веб-элементы управления TextBox создаются даже для тех полей, которые доступны только для чтения, например CategoryName и SupplierName.Specifically, the TextBox Web controls are created even for those fields that are read-only, such as CategoryName and SupplierName. Как и в случае с EditItemTemplate, необходимо удалить эти текстовые поля из InsertItemTemplate.Like with the EditItemTemplate, we need to remove these TextBoxes from the InsertItemTemplate.

На рис. 24 показан элемент FormView в браузере при добавлении нового продукта, Acme кофе.Figure 24 shows the FormView in a browser when adding a new product, Acme Coffee. Обратите внимание, что поля SupplierName и CategoryName, показанные в ItemTemplate, больше не существуют, так как они были удалены.Note that the SupplierName and CategoryName fields shown in the ItemTemplate are no longer present, as we just removed them. При нажатии кнопки «Вставить» FormView выполняет ту же последовательность шагов, что и элемент управления DetailsView, добавляя новую запись в таблицу Products.When the Insert button is clicked the FormView proceeds through the same sequence of steps as the DetailsView control, adding a new record to the Products table. На рис. 25 показаны сведения о продукте ACME кофе в элементе FormView после его вставки.Figure 25 shows Acme Coffee product's details in the FormView after it has been inserted.

InsertItemTemplate определяет интерфейс вставки FormViewThe InsertItemTemplate Dictates the FormView's Inserting Interface

Рис. 24. InsertItemTemplate определяет интерфейс вставки FormView (щелкните, чтобы просмотреть изображение с полным размером)Figure 24: The InsertItemTemplate Dictates the FormView's Inserting Interface (Click to view full-size image)

сведения о новом продукте, Acme кофе, отображаются в элементе FormView.The Details for New Product, Acme Coffee, are Displayed in the FormView

Рис. 25. сведения о новом продукте, Acme кофе, отображаются в элементе FormView (щелкните, чтобы просмотреть изображение с полным размером).Figure 25: The Details for New Product, Acme Coffee, are Displayed in the FormView (Click to view full-size image)

Разделив интерфейсы только для чтения, редактирования и вставки на три отдельных шаблона, FormView обеспечивает более тонкую степень контроля над этими интерфейсами, чем DetailsView и GridView.By separating out the read-only, editing, and inserting interfaces into three separate templates, the FormView allows for a finer degree of control over these interfaces than the DetailsView and GridView.

Note

Как и DetailsView, свойство CurrentMode FormView указывает отображаемый интерфейс, а его свойство DefaultMode указывает режим, в который функция FormView возвращает значение после завершения операции редактирования или вставки.Like the DetailsView, the FormView's CurrentMode property indicates the interface being displayed and its DefaultMode property indicates the mode the FormView returns to after an edit or insert has been completed.

СводкаSummary

В этом учебнике мы рассмотрели основы вставки, редактирования и удаления данных с помощью элементов управления GridView, DetailsView и FormView.In this tutorial we examined the basics of inserting, editing, and deleting data using the GridView, DetailsView, and FormView. Все три этих элемента управления предоставляют определенный уровень встроенных возможностей изменения данных, которые можно использовать без написания единой строки кода на странице ASP.NET благодаря веб-элементам управления данными и ObjectDataSource.All three of these controls provide some level of built-in data modification capabilities that can be utilized without writing a single line of code in the ASP.NET page thanks to the data Web controls and the ObjectDataSource. Однако простые методы Point и Click отображают довольно фраил и наивный пользовательский интерфейс изменения данных.However, the simple point and click techniques render a fairly frail and naïve data modification user interface. Чтобы обеспечить проверку, внедрять программные значения, корректно обрабатывать исключения, настраивать пользовательский интерфейс и т. д., необходимо полагаться на множество методов, которые будут обсуждаться в следующих нескольких руководствах.To provide validation, inject programmatic values, gracefully handle exceptions, customize the user interface, and so on, we'll need to rely on a bevy of techniques that will be discussed over the next several tutorials.

Поздравляем с программированием!Happy Programming!

Об автореAbout the Author

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Скотт работает как независимый консультант, преподаватель и модуль записи.Scott works as an independent consultant, trainer, and writer. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Он доступен по адресу mitchell@4GuysFromRolla.com.He can be reached at mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.or via his blog, which can be found at http://ScottOnWriting.NET.