Добавление элементов управления проверки в интерфейсы правки и вставки (C#)Adding Validation Controls to the Editing and Inserting Interfaces (C#)

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

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

В этом учебнике мы покажем, как легко добавить элементы управления проверки в EditItemTemplate и InsertItemTemplate веб-элемента управления данными, чтобы обеспечить пользовательский интерфейс с более надежными правами.In this tutorial we'll see how easy it is to add validation controls to the EditItemTemplate and InsertItemTemplate of a data Web control, to provide a more foolproof user interface.

ВведениеIntroduction

Элементы управления GridView и DetailsView в примерах, рассмотренных в прошлых трех учебниках, состоят из BoundFields и Чеккбоксфиелдс (типы полей, автоматически добавленные Visual Studio при привязке элемента управления GridView или DetailsView к источнику данных. Управление через смарт-тег).The GridView and DetailsView controls in the examples we've explored over the past three tutorials have all been composed of BoundFields and CheckBoxFields (the field types automatically added by Visual Studio when binding a GridView or DetailsView to a data source control through the smart tag). При редактировании строки в GridView или DetailsView те BoundFields, которые не предназначены только для чтения, преобразуются в текстовые поля, из которых конечный пользователь может изменять существующие данные.When editing a row in a GridView or DetailsView, those BoundFields that are not read-only are converted into textboxes, from which the end user can modify the existing data. Аналогичным образом при вставке новой записи в элемент управления DetailsView эти BoundFields, свойство InsertVisible которых имеет значение true (по умолчанию), отображаются как пустые текстовые поля, в которых пользователь может предоставить значения полей новой записи.Similarly, when inserting a new record into a DetailsView control, those BoundFields whose InsertVisible property is set to true (the default) are rendered as empty textboxes, into which the user can provide the new record's field values. Аналогичным образом, Чеккбоксфиелдс, отключенные в стандартном интерфейсе только для чтения, преобразуются в флажки Enabled в интерфейсах правки и вставки.Likewise, CheckBoxFields, which are disabled in the standard, read-only interface, are converted into enabled checkboxes in the editing and inserting interfaces.

Хотя интерфейсы редактирования и вставки по умолчанию для BoundField и CheckBoxField могут быть полезными, интерфейс не имеет какой либо проверки.While the default editing and inserting interfaces for the BoundField and CheckBoxField can be helpful, the interface lacks any sort of validation. Если пользователь делает ввод данных недопущенным, например пропускает ProductName поле или вводит недопустимое значение для UnitsInStock (например,-50), в глубине архитектуры приложения будет создано исключение.If a user makes a data entry mistake - such as omitting the ProductName field or entering an invalid value for UnitsInStock (such as -50) an exception will be raised from within the depths of the application architecture. Хотя это исключение может быть корректно обработано, как показано в предыдущем руководстве, в идеале пользовательский интерфейс редактирования или вставки будет включать элементы управления проверки, чтобы предотвратить невозможность ввода таких недопустимых данных пользователем в первую очередь.While this exception can be gracefully handled as demonstrated in the previous tutorial, ideally the editing or inserting user interface would include validation controls to prevent a user from entering such invalid data in the first place.

Чтобы предоставить настраиваемый интерфейс редактирования или вставки, необходимо заменить BoundField или CheckBoxField на TemplateField.In order to provide a customized editing or inserting interface, we need to replace the BoundField or CheckBoxField with a TemplateField. Полей TemplateField, которая была темой обсуждения в разделе Использование полей TemplateField в элементе управления GridView и Использование полей TemplateField в руководствах по элементу управления DetailsView , может состоять из нескольких шаблонов, определяющих отдельные интерфейсы для различных состояний строк.TemplateFields, which were the topic of discussion in the Using TemplateFields in the GridView Control and Using TemplateFields in the DetailsView Control tutorials, can consist of multiple templates defining separate interfaces for different row states. ItemTemplate TemplateField используется для отображения полей или строк, предназначенных только для чтения, в элементах управления DetailsView или GridView, в то время как EditItemTemplate и InsertItemTemplate указывают интерфейсы для использования в режимах редактирования и вставки соответственно.The TemplateField's ItemTemplate is used to when rendering read-only fields or rows in the DetailsView or GridView controls, whereas the EditItemTemplate and InsertItemTemplate indicate the interfaces to use for the editing and inserting modes, respectively.

В этом учебнике мы рассмотрим, как легко добавить элементы управления проверки в EditItemTemplate и InsertItemTemplate для предоставления более защищенного пользовательского интерфейса.In this tutorial we'll see how easy it is to add validation controls to the TemplateField's EditItemTemplate and InsertItemTemplate to provide a more foolproof user interface. В частности, в этом учебнике используется пример, созданный в статье изучение событий, связанных с руководством по вставке, обновлению и удалению, и дополнение интерфейсов правки и вставки для включения соответствующей проверки.Specifically, this tutorial takes the example created in the Examining the Events Associated with Inserting, Updating, and Deleting tutorial and augments the editing and inserting interfaces to include appropriate validation.

Шаг 1. репликация примера изпроверки событий, связанных с вставкой, обновлением и удалениемStep 1: Replicating the Example fromExamining the Events Associated with Inserting, Updating, and Deleting

В ходе изучения событий, связанных с вставкой, обновлением и удалением учебника, мы создали страницу, в которой указаны имена и цены продуктов в редактируемом элементе управления GridView.In the Examining the Events Associated with Inserting, Updating, and Deleting tutorial we created a page that listed the names and prices of the products in an editable GridView. Кроме того, на странице содержится элемент DetailsView, для свойства DefaultMode которого было задано значение Insert, таким образом, всегда выполняется отрисовка в режиме вставки.Additionally, the page included a DetailsView whose DefaultMode property was set to Insert, thereby always rendering in insert mode. С помощью этой DetailsView пользователь может ввести имя и цену для нового продукта, нажать кнопку Вставить и добавить в систему (см. рис. 1).From this DetailsView, the user could enter the name and price for a new product, click Insert, and have it added to the system (see Figure 1).

предыдущем примере позволяет пользователям добавлять новые продукты и изменять существующие.The Previous Example Allows Users to Add New Products and Edit Existing Ones

Рис. 1. предыдущий пример позволяет пользователям добавлять новые продукты и изменять существующие (щелкните, чтобы просмотреть изображение с полным размером).Figure 1: The Previous Example Allows Users to Add New Products and Edit Existing Ones (Click to view full-size image)

Наша цель этого руководства — расширение DetailsView и GridView для предоставления элементов управления проверки.Our goal for this tutorial is to augment the DetailsView and GridView to provide validation controls. В частности, наша логика проверки будет:In particular, our validation logic will:

  • Требовать, чтобы имя было указано при вставке или изменении продуктаRequire that the name be provided when inserting or editing a product
  • Требовать, чтобы цена была предоставлена при вставке записи; При редактировании записи будет по-прежнему требоваться Цена, но будет использоваться программная логика в обработчике событий RowUpdating GridView, уже присутствующей в предыдущем руководстве.Require that the price be provided when inserting a record; when editing a record, we will still require a price, but will use the programmatic logic in the GridView's RowUpdating event handler already present from the earlier tutorial
  • Убедитесь, что значение, указанное для цены, является допустимым форматом валюты.Ensure that the value entered for the price is a valid currency format

Прежде чем можно будет рассмотреть возможность расширения предыдущего примера, чтобы включить проверку, сначала необходимо выполнить репликацию примера со страницы DataModificationEvents.aspx на страницу этого руководства, UIValidation.aspx.Before we can look at augmenting the previous example to include validation, we first need to replicate the example from the DataModificationEvents.aspx page to the page for this tutorial, UIValidation.aspx. Чтобы сделать это, необходимо скопировать декларативную разметку DataModificationEvents.aspx страницы и ее исходный код.To accomplish this we need to copy over both the DataModificationEvents.aspx page's declarative markup and its source code. Сначала скопируйте декларативную разметку, выполнив следующие действия.First copy over the declarative markup by performing the following steps:

  1. Открытие страницы DataModificationEvents.aspx в Visual StudioOpen the DataModificationEvents.aspx page in Visual Studio
  2. Переход к декларативной разметке страницы (нажмите кнопку "источник" в нижней части страницы)Go to the page's declarative markup (click on the Source button at the bottom of the page)
  3. Скопируйте текст в теги <asp:Content> и </asp:Content> (строки с 3 по 44), как показано на рис. 2.Copy the text within the <asp:Content> and </asp:Content> tags (lines 3 through 44), as shown in Figure 2.

скопировать текст в элемент управления <ASP: Content>Copy the Text Within the <asp:Content> Control

Рис. 2. копирование текста внутри элемента управления <asp:Content> (щелкните, чтобы просмотреть изображение с полным размером)Figure 2: Copy the Text Within the <asp:Content> Control (Click to view full-size image)

  1. Открытие страницы UIValidation.aspxOpen the UIValidation.aspx page
  2. Переход к декларативной разметке страницыGo to the page's declarative markup
  3. Вставьте текст в элемент управления <asp:Content>.Paste the text within the <asp:Content> control.

Чтобы скопировать исходный код, откройте страницу DataModificationEvents.aspx.cs и скопируйте только текст внутри класса EditInsertDelete_DataModificationEvents.To copy over the source code, open the DataModificationEvents.aspx.cs page and copy just the text within the EditInsertDelete_DataModificationEvents class. Скопируйте три обработчика событий (Page_Load, GridView1_RowUpdatingи ObjectDataSource1_Inserting), но не копируйте объявление класса или операторы using.Copy the three event handlers (Page_Load, GridView1_RowUpdating, and ObjectDataSource1_Inserting), but do not copy the class declaration or using statements. Вставьте скопированный текст в класс EditInsertDelete_UIValidation в UIValidation.aspx.cs .Paste the copied text within the EditInsertDelete_UIValidation class in UIValidation.aspx.cs.

После перемещения содержимого и кода с DataModificationEvents.aspx на UIValidation.aspx, уделите несколько минут тестированию хода выполнения в браузере.After moving over the content and code from DataModificationEvents.aspx to UIValidation.aspx, take a moment to test out your progress in a browser. Вы должны увидеть одни и те же функции в каждой из этих двух страниц (см. рис. 1 для снимка экрана DataModificationEvents.aspx в действии).You should see the same output and experience the same functionality in each of these two pages (refer back to Figure 1 for a screen shot of DataModificationEvents.aspx in action).

Шаг 2. Преобразование BoundFields в полей TemplateFieldStep 2: Converting the BoundFields Into TemplateFields

Чтобы добавить элементы управления проверки в интерфейсы правки и вставки, BoundFields, используемый элементами управления DetailsView и GridView, необходимо преобразовать в полей TemplateField.To add validation controls to the editing and inserting interfaces, the BoundFields used by the DetailsView and GridView controls need to be converted into TemplateFields. Чтобы добиться этого, щелкните ссылку изменить столбцы и изменить поля в смарт-тегах GridView и DetailsView соответственно.To achieve this, click on the Edit Columns and Edit Fields links in the GridView and DetailsView's smart tags, respectively. Выберите все BoundFields и щелкните ссылку "преобразовать это поле в TemplateField".There, select each of the BoundFields and click the "Convert this field into a TemplateField" link.

преобразовать все BoundFields элемента DetailsView и GridView в полей TemplateFieldConvert Each of the DetailsView's and GridView's BoundFields Into TemplateFields

Рис. 3. Преобразование всех BoundFields элементов DetailsView и GridView в полей TemplateField (щелкните, чтобы просмотреть изображение с полным размером)Figure 3: Convert Each of the DetailsView's and GridView's BoundFields Into TemplateFields (Click to view full-size image)

При преобразовании BoundField в TemplateField с помощью диалогового окна "поля" создается TemplateField, которая имеет те же интерфейсы только для чтения, правки и вставки, что и сам BoundField.Converting a BoundField into a TemplateField through the Fields dialog box generates a TemplateField that exhibits the same read-only, editing, and inserting interfaces as the BoundField itself. В следующей разметке показан декларативный синтаксис поля ProductName в DetailsView после его преобразования в TemplateField:The following markup shows the declarative syntax for the ProductName field in the DetailsView after it has been converted into a TemplateField:

<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </EditItemTemplate>
    <InsertItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </InsertItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Обратите внимание, что в этом TemplateField созданы три шаблона, которые автоматически создаются ItemTemplate, EditItemTemplateи InsertItemTemplate.Note that this TemplateField had three templates automatically created ItemTemplate, EditItemTemplate, and InsertItemTemplate. ItemTemplate отображает одно значение поля данных (ProductName) с помощью веб-элемента управления Label, а EditItemTemplate и InsertItemTemplate представлять значение поля данных в веб-элементе управления TextBox, связывающем поле данных с свойством Text текстового поля, используя двустороннюю привязку данных.The ItemTemplate displays a single data field value (ProductName) using a Label Web control, while the EditItemTemplate and InsertItemTemplate present the data field value in a TextBox Web control that associates the data field with the TextBox's Text property using two-way databinding. Так как мы используем только DetailsView на этой странице для вставки, вы можете удалить ItemTemplate и EditItemTemplate из двух полей TemplateField, несмотря на то, что они не имеют вреда.Since we are only using the DetailsView in this page for inserting, you may remove the ItemTemplate and EditItemTemplate from the two TemplateFields, although there's no harm in leaving them.

Поскольку GridView не поддерживает встроенные функции вставки элемента управления DetailsView, преобразование поля ProductName GridView в TemplateField приводит только к ItemTemplate и EditItemTemplate:Since the GridView does not support the built-in inserting features of the DetailsView, converting the GridView's ProductName field into a TemplateField results in only an ItemTemplate and EditItemTemplate:

<asp:TemplateField HeaderText="ProductName" SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Нажимая кнопку "преобразовать это поле в TemplateField", Visual Studio создаст TemplateField, шаблоны которого имитируют пользовательский интерфейс преобразованной BoundField.By clicking the "Convert this field into a TemplateField," Visual Studio has created a TemplateField whose templates mimic the user interface of the converted BoundField. Это можно проверить, перейдя на эту страницу в браузере.You can verify this by visiting this page through a browser. Вы обнаружите, что внешний вид и поведение полей TemplateField идентичны опыту при использовании BoundFields.You'll find that the appearance and behavior of the TemplateFields is identical to the experience when BoundFields were used instead.

Note

Вы можете настроить интерфейсы редактирования в шаблонах по мере необходимости.Feel free to customize the editing interfaces in the templates as needed. Например, может потребоваться, чтобы текстовое поле в UnitPrice полей TemplateField отображалось как меньшее текстовое поле, чем ProductName текстовое поле.For example, we may want to have the TextBox in the UnitPrice TemplateFields rendered as a smaller textbox than the ProductName textbox. Для этого можно задать для свойства Columns текстового поля соответствующее значение или предоставить абсолютную ширину с помощью свойства Width.To accomplish this you can set the TextBox's Columns property to an appropriate value or provide an absolute width via the Width property. В следующем учебном курсе мы посмотрим, как полностью настроить интерфейс редактирования, заменив текстовое поле на альтернативный веб-элемент управления вводом данных.In the next tutorial we'll see how to completely customize the editing interface by replacing the TextBox with an alternate data entry Web control.

Шаг 3. Добавление элементов управления проверки вEditItemTemplate s элемента GridViewStep 3: Adding the Validation Controls to the GridView'sEditItemTemplate s

При создании форм ввода данных важно, чтобы пользователи вводили все необходимые поля и все предоставленные входные данные были допустимыми, правильно отформатированными значениями.When constructing data entry forms, it is important that users enter any required fields and that all provided inputs are legal, properly-formatted values. Чтобы обеспечить допустимость входных данных пользователя, ASP.NET предоставляет пять встроенных элементов управления проверки, предназначенных для проверки значения одного элемента управления вводом:To help ensure that a user's inputs are valid, ASP.NET provides five built-in validation controls that are designed to be used to validate the value of a single input control:

Дополнительные сведения об этих пяти элементах управления см. в разделе "элементы проверки" статьи краткие руководства по ASP.NET.For more information on these five controls, check out the Validation Controls section of the ASP.NET Quickstart Tutorials.

В нашем учебном курсе необходимо использовать RequiredFieldValidator в элементах управления DetailsView и GridView ProductName полей TemplateField и RequiredFieldValidator в UnitPrice TemplateField DetailsView.For our tutorial we'll need to use a RequiredFieldValidator in both the DetailsView and GridView's ProductName TemplateFields and a RequiredFieldValidator in the DetailsView's UnitPrice TemplateField. Кроме того, необходимо добавить объект CompareValidator в элементы управления UnitPrice полей TemplateField, гарантирующие, что введенная цена имеет значение, большее или равное 0, и представлено в допустимом формате валюты.Furthermore, we'll need to add a CompareValidator to both controls' UnitPrice TemplateFields that ensures that the entered price has a value greater than or equal to 0 and is presented in a valid currency format.

Note

Хотя в ASP.NET 1. x существовали те же пять элементов управления проверки, ASP.NET 2,0 добавил ряд усовершенствований, две основные возможности поддержки сценариев на стороне клиента для браузеров, отличных от Internet Explorer, и возможность секционировать элементы управления проверкой на странице в группы проверки.While ASP.NET 1.x had these same five validation controls, ASP.NET 2.0 has added a number of improvements, the main two being client-side script support for browsers other than Internet Explorer and the ability to partition validation controls on a page into validation groups. Дополнительные сведения о новых возможностях элементов управления проверки в 2,0 см. в статье которая разбила The проверки элементов управления в ASP.NET 2,0.For more information on the new validation control features in 2.0, refer to Dissecting the Validation Controls in ASP.NET 2.0.

Начнем с добавления необходимых элементов управления проверки в EditItemTemplate s в полей TemplateField GridView.Let's start by adding the necessary validation controls to the EditItemTemplate s in the GridView's TemplateFields. Чтобы сделать это, щелкните ссылку изменить шаблоны в смарт-теге GridView, чтобы открыть интерфейс редактирования шаблонов.To accomplish this, click on the Edit Templates link from the GridView's smart tag to bring up the template editing interface. Здесь можно выбрать шаблон для редактирования из раскрывающегося списка.From here, you can select which template to edit from the drop-down list. Так как мы хотим расширить интерфейс редактирования, нам нужно добавить элементы управления проверки в ProductName и UnitPrice``EditItemTemplate s.Since we want to augment the editing interface, we need to add validation controls to the ProductName and UnitPrice's EditItemTemplate s.

нам нужно расширить Едититемтемплатес ProductName и UnitPriceWe Need to Extend the ProductName and UnitPrice's EditItemTemplates

Рис. 4. необходимо расширить ProductName и UnitPrice``EditItemTemplate s (щелкните, чтобы просмотреть изображение с полным размером)Figure 4: We Need to Extend the ProductName and UnitPrice's EditItemTemplate s (Click to view full-size image)

В ProductName EditItemTemplateдобавьте RequiredFieldValidator, перетащив его из панели элементов в интерфейс редактирования шаблона, поместив после текстового поля.In the ProductName EditItemTemplate, add a RequiredFieldValidator by dragging it from the Toolbox into the template editing interface, placing after the TextBox.

добавить RequiredFieldValidator в ProductName EditItemTemplateAdd a RequiredFieldValidator to the ProductName EditItemTemplate

Рис. 5. Добавление RequiredFieldValidator в EditItemTemplate ProductName (щелкните, чтобы просмотреть изображение с полным размером)Figure 5: Add a RequiredFieldValidator to the ProductName EditItemTemplate (Click to view full-size image)

Все элементы управления проверки работают путем проверки входных данных одного веб-элемента управления ASP.NET.All validation controls work by validating the input of a single ASP.NET Web control. Поэтому необходимо указать, что RequiredFieldValidator, который мы только что добавили, должен проверяться на соответствие текстовому полю в EditItemTemplate; Это достигается путем присвоения свойству ControlToValidate проверяющего элемента ID соответствующего веб-элемента управления.Therefore, we need to indicate that the RequiredFieldValidator we just added should validate against the TextBox in the EditItemTemplate; this is accomplished by setting the validation control's ControlToValidate property to the ID of the appropriate Web control. В настоящее время текстовое поле имеет довольно неопределенный ID TextBox1, но давайте изменим его на что-то более подходящее.The TextBox currently has the rather nondescript ID of TextBox1, but let's change it to something more appropriate. Щелкните текстовое поле в шаблоне, а затем в окно свойств измените ID с TextBox1 на EditProductName.Click on the TextBox in the template and then, from the Properties window, change the ID from TextBox1 to EditProductName.

изменить идентификатор TextBox на ЕдитпродуктнамеChange the TextBox's ID to EditProductName

Рис. 6. изменение ID текстового поля на EditProductName (щелкните, чтобы просмотреть изображение с полным размером)Figure 6: Change the TextBox's ID to EditProductName (Click to view full-size image)

Затем задайте для свойства ControlToValidate RequiredFieldValidator значение EditProductName.Next, set the RequiredFieldValidator's ControlToValidate property to EditProductName. Наконец, задайте для свойства ErrorMessage значение "необходимо указать имя продукта", а свойству Text — значение "*".Finally, set the ErrorMessage property to "You must provide the product's name" and the Text property to "*". Значение свойства Text, если оно указано, является текстом, отображаемым элементом управления проверки, если проверка завершается неудачно.The Text property value, if provided, is the text that is displayed by the validation control if the validation fails. Значение свойства ErrorMessage, которое является обязательным, используется элементом управления ValidationSummary; Если значение свойства Text опущено, ErrorMessage значение свойства также является текстом, отображаемым элементом управления проверки на недопустимые входные данные.The ErrorMessage property value, which is required, is used by the ValidationSummary control; if the Text property value is omitted, the ErrorMessage property value is also the text displayed by the validation control on invalid input.

После установки этих трех свойств RequiredFieldValidator экран должен выглядеть примерно так, как показано на рис. 7.After setting these three properties of the RequiredFieldValidator, your screen should look similar to Figure 7.

задать свойства ControlToValidate, ErrorMessage и Text для RequiredFieldValidatorSet the RequiredFieldValidator's ControlToValidate, ErrorMessage, and Text Properties

Рис. 7. задание свойств ControlToValidate, ErrorMessageи Text для RequiredFieldValidator (щелкните, чтобы просмотреть изображение с полным размером)Figure 7: Set the RequiredFieldValidator's ControlToValidate, ErrorMessage, and Text Properties (Click to view full-size image)

После добавления RequiredFieldValidator в EditItemTemplate``ProductName остается только добавить необходимую проверку в UnitPrice EditItemTemplate.With the RequiredFieldValidator added to the ProductName EditItemTemplate, all that remains is to add the necessary validation to the UnitPrice EditItemTemplate. Поскольку мы решили, что для этой страницы UnitPrice не является обязательным при редактировании записи, нам не нужно добавлять RequiredFieldValidator.Since we've decided that, for this page, the UnitPrice is optional when editing a record, we don't need to add a RequiredFieldValidator. Однако нам нужно добавить объект CompareValidator, чтобы UnitPrice, если он указан, правильно отформатирована как денежная единица и больше или равна 0.We do, however, need to add a CompareValidator to ensure that the UnitPrice, if supplied, is properly formatted as a currency and is greater than or equal to 0.

Прежде чем добавить объект CompareValidator в EditItemTemplate``UnitPrice, сначала измените идентификатор веб-элемента управления TextBox с TextBox2 на EditUnitPrice.Before we add the CompareValidator to the UnitPrice EditItemTemplate, let's first change the TextBox Web control's ID from TextBox2 to EditUnitPrice. После внесения этого изменения добавьте объект CompareValidator, установив для его свойства ControlToValidate значение EditUnitPrice, его свойство ErrorMessage значение "цена должна быть больше или равна нулю и не может включать символ валюты", а также его свойство Text в "*".After making this change, add the CompareValidator, setting its ControlToValidate property to EditUnitPrice, its ErrorMessage property to "The price must be greater than or equal to zero and cannot include the currency symbol", and its Text property to "*".

Чтобы указать, что значение UnitPrice должно быть больше или равно 0, установите свойство оператора CompareValidator в значение GreaterThanEqual, свойство валуетокомпаре в значение 0, а свойство Type — в значение Currency.To indicate that the UnitPrice value must be greater than or equal to 0, set the CompareValidator's Operator property to GreaterThanEqual, its ValueToCompare property to "0", and its Type property to Currency. Следующий декларативный синтаксис показывает EditItemTemplate UnitPrice TemplateField после внесения этих изменений:The following declarative syntax shows the UnitPrice TemplateField's EditItemTemplate after these changes have been made:

<EditItemTemplate>
    <asp:TextBox ID="EditUnitPrice" runat="server"
      Text='<%# Bind("UnitPrice", "{0:c}") %>'
      Columns="6"></asp:TextBox>
    <asp:CompareValidator ID="CompareValidator1" runat="server"
        ControlToValidate="EditUnitPrice"
        ErrorMessage="The price must be greater than or equal to zero and
                       cannot include the currency symbol"
        Operator="GreaterThanEqual" Type="Currency"
        ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>

После внесения этих изменений откройте страницу в браузере.After making these changes, open the page in a browser. Если вы попытаетесь опустить имя или ввести недопустимое значение цены при редактировании продукта, рядом с текстовым полем появится звездочка.If you attempt to omit the name or enter an invalid price value when editing a product, an asterisk appears next to the textbox. Как показано на рис. 8, значение цены, включающее символ валюты, например $19,95, считается недопустимым.As Figure 8 shows, a price value that includes the currency symbol such as $19.95 is considered invalid. Currency объекта CompareValidator Type допускает разделители цифр (например, запятые или точки, в зависимости от настроек языка и региональных параметров) и начальный знак плюса или минуса, но не допускает символ валюты.The CompareValidator's Currency Type allows for digit separators (such as commas or periods, depending on the culture settings) and a leading plus or minus sign, but does not permit a currency symbol. Это поведение может озадачить пользователей, так как интерфейс правки в настоящее время визуализирует UnitPrice, используя формат валюты.This behavior may perplex users as the editing interface currently renders the UnitPrice using the currency format.

Note

Вспомним, что в учебнике события, связанные с вставкой, обновлением и удалением, мы установили для свойства DataFormatString BoundField значение {0:c}, чтобы отформатировать его как денежную единицу.Recall that in the Events Associated with Inserting, Updating, and Deleting tutorial we set the BoundField's DataFormatString property to {0:c} in order to format it as a currency. Кроме того, свойству ApplyFormatInEditMode присваивается значение true, в результате чего интерфейс редактирования GridView форматирует UnitPrice как денежную единицу.Furthermore, we set the ApplyFormatInEditMode property to true, causing the GridView's editing interface to format the UnitPrice as a currency. При преобразовании BoundField в TemplateField Visual Studio отметил эти параметры и отформатирует свойство Text текстового поля как денежную единицу с помощью синтаксиса DataBinding <%# Bind("UnitPrice", "{0:c}") %>.When converting the BoundField into a TemplateField, Visual Studio noted these settings and formatted the TextBox's Text property as a currency using the databinding syntax <%# Bind("UnitPrice", "{0:c}") %>.

звездочка отображается рядом с текстовыми полями с недопустимыми входными даннымиAn Asterisk Appears Next to the Textboxes with Invalid Input

Рис. 8. Звездочка рядом с текстовыми полями с недопустимым входом (щелкните, чтобы просмотреть изображение с полным размером)Figure 8: An Asterisk Appears Next to the Textboxes with Invalid Input (Click to view full-size image)

Хотя проверка работает как есть, пользователь должен вручную удалить символ валюты при редактировании записи, что неприемлемо.While the validation works as-is, the user has to manually remove the currency symbol when editing a record, which is not acceptable. Для устранения этой проблемы у нас есть три варианта:To remedy this, we have three options:

  1. Настройте EditItemTemplate таким образом, чтобы значение UnitPrice не отформатировано как денежная единица.Configure the EditItemTemplate so that the UnitPrice value is not formatted as a currency.
  2. Разрешить пользователю вводить символ валюты, удаляя объект CompareValidator и заменяя его Регуларекспрессионвалидатор, который правильно проверяет значение валюты в правильном формате.Allow the user to enter a currency symbol by removing the CompareValidator and replacing it with a RegularExpressionValidator that properly checks for a properly formatted currency value. Проблема в том, что регулярное выражение для проверки значения валюты не вполне достаточно и потребует написания кода, если нам хотелось бы включить параметры языка и региональных параметров.The problem here is that the regular expression to validate a currency value is not pretty and would require writing code if we wanted to incorporate culture settings.
  3. Полностью удалите элемент управления проверки и полагаются на логику проверки на стороне сервера в обработчике событий RowUpdating GridView.Remove the validation control altogether and rely on server-side validation logic in the GridView's RowUpdating event handler.

Давайте перейдем к параметру #1 для этого упражнения.Let's go with option #1 for this exercise. В настоящее время UnitPrice форматируется как валюта из-за выражения привязки данных для текстового поля в EditItemTemplate: <%# Bind("UnitPrice", "{0:c}") %>.Currently the UnitPrice is formatted as a currency due to the databinding expression for the TextBox in the EditItemTemplate: <%# Bind("UnitPrice", "{0:c}") %>. Измените инструкцию Bind на Bind("UnitPrice", "{0:n2}"), которая форматирует результат как число с двумя цифрами точности.Change the Bind statement to Bind("UnitPrice", "{0:n2}"), which formats the result as a number with two digits of precision. Это можно сделать напрямую с помощью декларативного синтаксиса или щелкнув ссылку Edit DataBindings (изменить ссылки на данные) в текстовом поле EditUnitPrice в EditItemTemplateе UnitPrice TemplateField (см. рис. 9 и 10).This can be done directly through the declarative syntax or by clicking on the Edit DataBindings link from the EditUnitPrice TextBox in the UnitPrice TemplateField's EditItemTemplate (see Figures 9 and 10).

щелкните ссылку изменить привязки к элементу TextBox.Click on the TextBox's Edit DataBindings link

Рис. 9. Щелкните ссылку Edit DataBindings (Правка) текстового поля (щелкните, чтобы просмотреть изображение с полным размером)Figure 9: Click on the TextBox's Edit DataBindings link (Click to view full-size image)

указать описатель формата в инструкции BINDSpecify the Format Specifier in the Bind Statement

Рис. 10. Указание описателя формата в операторе Bind (щелкните, чтобы просмотреть изображение с полным размером)Figure 10: Specify the Format Specifier in the Bind Statement (Click to view full-size image)

При этом изменении отформатированная Цена в интерфейсе редактирования включает запятые в качестве разделителя групп и точку в качестве десятичного разделителя, но оставляет символ валюты.With this change, the formatted price in the editing interface includes commas as the group separator and a period as the decimal separator, but leaves off the currency symbol.

Note

UnitPrice EditItemTemplate не содержит RequiredFieldValidator, что позволяет выполнить обратную передачу и инициировать логику обновления.The UnitPrice EditItemTemplate doesn't include a RequiredFieldValidator, allowing the postback to ensue and the updating logic to commence. Однако обработчик событий RowUpdating, скопированный из руководства по вставке, обновлению и удалению , содержит программную проверку, которая гарантирует, что UnitPrice предоставляется.However, the RowUpdating event handler copied over from the Examining the Events Associated with Inserting, Updating, and Deleting tutorial includes a programmatic check that ensures that the UnitPrice is provided. Вы можете удалить эту логику, оставить ее в виде "как есть" или добавить RequiredFieldValidator в EditItemTemplate``UnitPrice.Feel free to remove this logic, leave it in as-is, or add a RequiredFieldValidator to the UnitPrice EditItemTemplate.

Шаг 4. сводка проблем ввода данныхStep 4: Summarizing Data Entry Problems

В дополнение к пяти проверочным элементам управления ASP.NET включает элемент управления ValidationSummary, который отображает ErrorMessageные элементы управления проверки, которые обнаружили недопустимые данные.In addition to the five validation controls, ASP.NET includes the ValidationSummary control, which displays the ErrorMessage s of those validation controls that detected invalid data. Сводные данные могут отображаться в виде текста на веб-странице или с помощью модального окна MessageBox на стороне клиента.This summary data can be displayed as text on the web page or through a modal, client-side messagebox. Попробуем улучшить этот учебник, чтобы включить в клиент MessageBox сводку по всем проблемам проверки.Let's enhance this tutorial to include a client-side messagebox summarizing any validation problems.

Для этого перетащите элемент управления ValidationSummary с панели инструментов в конструктор.To accomplish this, drag a ValidationSummary control from the Toolbox onto the Designer. Расположение элемента управления проверки не имеет значения, так как мы настроим его для вывода сводки только в виде MessageBox.The location of the Validation control doesn't really matter, since we're going to configure it to only display the summary as a messagebox. После добавления элемента управления задайте для его Свойства шовсуммари значение false а свойству метода showmessagebox — значение true.After adding the control, set its ShowSummary property to false and its ShowMessageBox property to true. Благодаря этому добавлению все ошибки проверки обрабатываются в элементе MessageBox на стороне клиента.With this addition, any validation errors are summarized in a client-side messagebox.

ошибки проверки обобщены в окне MessageBox на стороне клиентаThe Validation Errors are Summarized in a Client-Side Messagebox

Рис. 11. ошибки проверки обобщены в окне MessageBox на стороне клиента (щелкните, чтобы просмотреть изображение с полным размером)Figure 11: The Validation Errors are Summarized in a Client-Side Messagebox (Click to view full-size image)

Шаг 5. Добавление элементов управления проверки вInsertItemTemplate элемента DetailsViewStep 5: Adding the Validation Controls to the DetailsView'sInsertItemTemplate

Все, что остается в этом руководстве, — добавить элементы управления проверки в интерфейс вставки DetailsView.All that remains for this tutorial is to add the validation controls to the DetailsView's inserting interface. Процесс добавления элементов управления проверки в шаблоны DetailsView идентичен тому, что был проверен в шаге 3. Поэтому мы удалим задачу на этом шаге.The process of adding validation controls to the DetailsView's templates is identical to that examined in Step 3; therefore, we'll breeze through the task in this step. Как и в случае с EditItemTemplate GridView, я рекомендую переименовать ID s из текстовых полей из TextBox1 неопределенный и TextBox2 в InsertProductName и InsertUnitPrice.As we did with the GridView's EditItemTemplate s, I encourage you to rename the ID s of the TextBoxes from the nondescript TextBox1 and TextBox2 to InsertProductName and InsertUnitPrice.

Добавьте RequiredFieldValidator в InsertItemTemplate``ProductName.Add a RequiredFieldValidator to the ProductName InsertItemTemplate. Присвойте ControlToValidate ID текстового поля в шаблоне, его свойству Text значение "*" и свойству ErrorMessage значение "необходимо указать имя продукта".Set the ControlToValidate to the ID of the TextBox in the template, its Text property to "*" and its ErrorMessage property to "You must provide the product's name".

Поскольку UnitPrice требуется для этой страницы при добавлении новой записи, добавьте RequiredFieldValidator в UnitPrice InsertItemTemplate, указав свойства ControlToValidate, Textи ErrorMessage соответствующим образом.Since the UnitPrice is required for this page when adding a new record, add a RequiredFieldValidator to the UnitPrice InsertItemTemplate, setting its ControlToValidate, Text, and ErrorMessage properties appropriately. Наконец, добавьте элемент управления CompareValidator в InsertItemTemplate UnitPrice, настроив его свойства ControlToValidate, Text, ErrorMessage, Type, Operatorи ValueToCompare точно так же, как и в элементе управления CompareValidator UnitPriceв EditItemTemplateGridView.Finally, add a CompareValidator to the UnitPrice InsertItemTemplate as well, configuring its ControlToValidate, Text, ErrorMessage, Type, Operator, and ValueToCompare properties just like we did with the UnitPrice's CompareValidator in the GridView's EditItemTemplate.

После добавления этих элементов управления проверки новый продукт не может быть добавлен в систему, если его имя не указано или если его цена является отрицательным числом или недопустимым форматом.After adding these validation controls, a new product cannot be added to the system if its name is not supplied or if its price is a negative number or illegally formatted.

в интерфейс вставки DetailsView добавлена логика проверкиValidation Logic has been Added to the DetailsView's Inserting Interface

Рис. 12. логика проверки добавлена в интерфейс вставки DetailsView (щелкните, чтобы просмотреть изображение с полным размером)Figure 12: Validation Logic has been Added to the DetailsView's Inserting Interface (Click to view full-size image)

Шаг 6. секционирование проверяющих элементов управления в группы проверкиStep 6: Partitioning the Validation Controls Into Validation Groups

Наша страница состоит из двух логически разнородных наборов элементов управления проверки: тех, которые соответствуют интерфейсу правки GridView, и тем, которые соответствуют интерфейсу вставки DetailsView.Our page consists of two logically disparate sets of validation controls: those that correspond to the GridView's editing interface and those that correspond to the DetailsView's inserting interface. По умолчанию, когда выполняется обратная передача, проверяются все элементы управления проверки на странице.By default, when a postback occurs all validation controls on the page are checked. Однако при редактировании записи мы не хотим, чтобы элементы управления проверки интерфейса вставки элемента DetailsView были проверены.However, when editing a record we don't want the DetailsView's inserting interface's validation controls to validate. На рис. 13 показаны наши текущие дилеммой, когда пользователь редактирует продукт с помощью идеально допустимых значений. Если нажать кнопку обновить, это приведет к ошибке проверки, так как значения Name и Price в интерфейсе вставки пусты.Figure 13 illustrates our current dilemma when a user is editing a product with perfectly legal values, clicking Update causes a validation error because the name and price values in the inserting interface are blank.

обновление продукта приводит к срабатыванию элементов управления проверки интерфейса вставкиUpdating a Product Causes the Inserting Interface's Validation Controls to Fire

Рис. 13. Обновление продукта вызывает срабатывание элементов управления проверки интерфейса вставки (щелкните, чтобы просмотреть изображение с полным размером)Figure 13: Updating a Product Causes the Inserting Interface's Validation Controls to Fire (Click to view full-size image)

Элементы управления проверки в ASP.NET 2,0 могут быть разделены на группы проверки с помощью свойства ValidationGroup.The validation controls in ASP.NET 2.0 can be partitioned into validation groups through their ValidationGroup property. Чтобы связать набор элементов управления проверки в группе, просто присвойте свойству ValidationGroup одно и то же значение.To associate a set of validation controls in a group, simply set their ValidationGroup property to the same value. Для нашего руководства задайте для свойств ValidationGroup элементов управления проверки в элементе GridView полей TemplateField значение EditValidationControls и ValidationGroup свойства полей TemplateField DetailsView InsertValidationControls.For our tutorial, set the ValidationGroup properties of the validation controls in the GridView's TemplateFields to EditValidationControls and the ValidationGroup properties of the DetailsView's TemplateFields to InsertValidationControls. Эти изменения можно выполнить непосредственно в декларативной разметке или с помощью окно свойств при использовании интерфейса редактирования шаблона конструктора.These changes can be done directly in the declarative markup or through the Properties window when using the Designer's edit template interface.

Помимо элементов управления проверки, кнопки и элементы управления, связанные с кнопками в ASP.NET 2,0, также включают свойство ValidationGroup.In addition to the validation controls, the Button and Button-related controls in ASP.NET 2.0 also include a ValidationGroup property. Проверяющие элементы управления для группы проверки проверяются на допустимость только в том случае, если обратная передача вызывается кнопкой, имеющей тот же параметр ValidationGroup свойства.A validation group's validators are checked for validity only when a postback is induced by a Button that has the same ValidationGroup property setting. Например, чтобы кнопка вставки DetailsView активировала InsertValidationControls группу проверки, необходимо задать для свойства ValidationGroup CommandField значение InsertValidationControls (см. рис. 14).For example, in order for the DetailsView's Insert button to trigger the InsertValidationControls validation group we need to set the CommandField's ValidationGroup property to InsertValidationControls (see Figure 14). Кроме того, задайте для свойства Коммандфиелд'с ValidationGroup GridView значение EditValidationControls.Additionally, set the GridView's CommandField's ValidationGroup property to EditValidationControls.

установить для свойства Валидатионграуп Коммандфиелд'с DetailsView значение ИнсертвалидатионконтролсSet the DetailsView's CommandField's ValidationGroup property to InsertValidationControls

Рис. 14. установка свойства ValidationGroup коммандфиелд'с DetailsView в значение InsertValidationControls (щелкните, чтобы просмотреть изображение с полным размером)Figure 14: Set the DetailsView's CommandField's ValidationGroup property to InsertValidationControls (Click to view full-size image)

После этих изменений полей TemplateField и Коммандфиелдс DetailsView и GridView должны выглядеть следующим образом:After these changes, the DetailsView and GridView's TemplateFields and CommandFields should look similar to the following:

Полей TemplateField и CommandField DetailsViewThe DetailsView's TemplateFields and CommandField

<asp:TemplateField HeaderText="ProductName"
  SortExpression="ProductName">
    <InsertItemTemplate>
        <asp:TextBox ID="InsertProductName" runat="server"
         Text='<%# Bind("ProductName") %>'></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2"
          runat="server" ControlToValidate="InsertProductName"
            ErrorMessage="You must provide the product name"
            ValidationGroup="InsertValidationControls">*
        </asp:RequiredFieldValidator>
    </InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
    <InsertItemTemplate>
         <asp:TextBox ID="InsertUnitPrice" runat="server"
           Text='<%# Bind("UnitPrice") %>' Columns="6">
         </asp:TextBox>
         <asp:RequiredFieldValidator ID="RequiredFieldValidator3"
           runat="server" ControlToValidate="InsertUnitPrice"
            ErrorMessage="You must provide the product price"
            ValidationGroup="InsertValidationControls">*
         </asp:RequiredFieldValidator>
        <asp:CompareValidator ID="CompareValidator2" runat="server"
           ControlToValidate="InsertUnitPrice"
           ErrorMessage="The price must be greater than or equal to zero and
                          cannot include the currency symbol"
           Operator="GreaterThanEqual" Type="Currency" ValueToCompare="0"
           ValidationGroup="InsertValidationControls">*
        </asp:CompareValidator>
     </InsertItemTemplate>
 </asp:TemplateField>
<asp:CommandField ShowInsertButton="True"
  ValidationGroup="InsertValidationControls" />

CommandField и полей TemplateField GridViewThe GridView's CommandField and TemplateFields

<asp:CommandField ShowEditButton="True" ValidationGroup="EditValidationControls" />
<asp:TemplateField HeaderText="ProductName"
  SortExpression="ProductName">
    <EditItemTemplate>
        <asp:TextBox ID="EditProductName" runat="server"
          Text='<%# Bind("ProductName") %>'>
        </asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1"
            runat="server" ControlToValidate="EditProductName"
            ErrorMessage="You must provide the product name"
            ValidationGroup="EditValidationControls">*
        </asp:RequiredFieldValidator>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("ProductName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="UnitPrice" SortExpression="UnitPrice">
    <EditItemTemplate>
        <asp:TextBox ID="EditUnitPrice" runat="server"
          Text='<%# Bind("UnitPrice", "{0:n2}") %>' Columns="6"></asp:TextBox>
        <asp:CompareValidator ID="CompareValidator1" runat="server"
            ControlToValidate="EditUnitPrice"
            ErrorMessage="The price must be greater than or equal to zero and
                           cannot include the currency symbol"
            Operator="GreaterThanEqual" Type="Currency"
            ValueToCompare="0"
            ValidationGroup="EditValidationControls">*
        </asp:CompareValidator>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label2" runat="server"
            Text='<%# Bind("UnitPrice", "{0:c}") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:TemplateField>

На этом этапе проверочные элементы управления, относящиеся к редактированию, срабатывают только при нажатии кнопки обновления GridView, а проверочные элементы управления, относящиеся к вставке, срабатывают только при нажатии кнопки вставки DetailsView, устраняя проблему, выделенную на рис. 13.At this point the edit-specific validation controls fire only when the GridView's Update button is clicked and the insert-specific validation controls fire only when the DetailsView's Insert button is clicked, resolving the problem highlighted by Figure 13. Однако после этого изменения наш элемент управления ValidationSummary больше не отображается при вводе недопустимых данных.However, with this change our ValidationSummary control no longer displays when entering invalid data. Элемент управления ValidationSummary также содержит свойство ValidationGroup и отображает сводные данные только для этих элементов управления проверки в своей группе проверки.The ValidationSummary control also contains a ValidationGroup property and only shows summary information for those validation controls in its validation group. Поэтому на этой странице должны быть два элемента управления проверки: одна для группы проверки InsertValidationControls и одна для EditValidationControls.Therefore, we need to have two validation controls in this page, one for the InsertValidationControls validation group and one for EditValidationControls.

<asp:ValidationSummary ID="ValidationSummary1" runat="server"
    ShowMessageBox="True" ShowSummary="False"
    ValidationGroup="EditValidationControls" />
<asp:ValidationSummary ID="ValidationSummary2" runat="server"
    ShowMessageBox="True" ShowSummary="False"
    ValidationGroup="InsertValidationControls" />

С этим добавлением наш учебник завершен.With this addition our tutorial is complete!

СводкаSummary

Хотя BoundFields может предоставлять и интерфейс вставки, и правки, интерфейс нельзя настраивать.While BoundFields can provide both an inserting and editing interface, the interface is not customizable. Как правило, нам нужно добавить элементы управления проверки в интерфейс правки и вставки, чтобы убедиться, что пользователь вводит необходимые входные данные в допустимый формат.Commonly, we want to add validation controls to the editing and inserting interface to ensure that the user enters required inputs in a legal format. Для этого необходимо преобразовать BoundFields в полей TemplateField и добавить элементы управления проверки к соответствующим шаблонам.To accomplish this we must convert the BoundFields into TemplateFields and add the validation controls to the appropriate template(s). В этом учебнике мы расширили пример из статьи изучение событий, связанных с руководством по вставке, обновлению и удалению , добавляя элементы управления проверки в интерфейс вставки DetailsView и интерфейс правки GridView.In this tutorial we extended the example from the Examining the Events Associated with Inserting, Updating, and Deleting tutorial, adding validation controls to both the DetailsView's inserting interface and the GridView's editing interface. Более того, мы увидели, как отображать сводные данные проверки с помощью элемента управления ValidationSummary и как секционировать элементы управления проверки на странице в отдельные группы проверки.Moreover, we saw how to display summary validation information using the ValidationSummary control and how to partition the validation controls on the page into distinct validation groups.

Как мы видели в этом руководстве, полей TemplateField позволяют дополнять интерфейсы правки и вставки для включения элементов управления проверки.As we saw in this tutorial, TemplateFields allow the editing and inserting interfaces to be augmented to include validation controls. Полей TemplateField также можно расширить для включения дополнительных входных веб-элементов управления, что позволяет заменить текстовое поле более подходящим веб-элементом управления.TemplateFields can also be extended to include additional input Web controls, enabling the TextBox to be replaced by a more suitable Web control. В следующем учебном курсе мы покажем, как заменить элемент управления TextBox элементом управления DropDownList с привязкой к данным, который идеально подходит при редактировании внешнего ключа (такого как CategoryID или SupplierID в таблице Products).In our next tutorial we'll see how to replace the TextBox control with a data-bound DropDownList control, which is ideal when editing a foreign key (such as CategoryID or SupplierID in the Products table).

Поздравляем с программированием!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.

Специальная благодарностьSpecial Thanks To

Эта серия руководств была рассмотрена многими полезными рецензентами.This tutorial series was reviewed by many helpful reviewers. Потенциальным рецензентам для этого учебника были основными рецензентами и Зак Jones.Lead reviewers for this tutorial were Liz Shulok and Zack Jones. Хотите ознакомиться с моими будущими статьями MSDN?Interested in reviewing my upcoming MSDN articles? Если это так, расположите строку в mitchell@4GuysFromRolla.com.If so, drop me a line at mitchell@4GuysFromRolla.com.