Поделиться через


Добавление элементов управления проверки в интерфейсы правки и вставки (C#)

Скотт Митчелл

Загрузить PDF-файл

В этом руководстве мы посмотрим, как легко добавить элементы управления проверки в EditItemTemplate и InsertItemTemplate веб-элемента управления данными, чтобы обеспечить более надежную пользовательский интерфейс.

Введение

Элементы управления GridView и DetailsView в примерах, которые мы рассмотрели в последних трех руководствах, состоят из BoundFields и CheckBoxFields (типы полей, автоматически добавляемые Visual Studio при привязке GridView или DetailsView к элементу управления источником данных с помощью смарт-тега). При редактировании строки в GridView или DetailsView эти поля BoundField, не доступные только для чтения, преобразуются в текстовые поля, из которых пользователь может изменять существующие данные. Аналогичным образом при вставке новой записи в элемент управления DetailsView те BoundFields, свойству которых InsertVisible присвоено значение true (по умолчанию), отображаются в виде пустых текстовых полей, в которые пользователь может указать значения полей новой записи. Аналогичным образом CheckBoxFields, которые отключены в стандартном интерфейсе только для чтения, преобразуются в включенные флажки в интерфейсах редактирования и вставки.

Хотя интерфейсы редактирования и вставки по умолчанию для BoundField и CheckBoxField могут быть полезны, интерфейс не проверяется. Если пользователь допустит ошибку ввода данных, например опустить ProductName поле или ввести недопустимое значение для UnitsInStock (например, -50), из глубины архитектуры приложения будет вызвано исключение. Хотя это исключение можно корректно обработать, как показано в предыдущем руководстве, в идеале пользовательский интерфейс редактирования или вставки должен включать элементы управления проверкой, чтобы предотвратить ввод таких недопустимых данных пользователем.

Чтобы предоставить настраиваемый интерфейс редактирования или вставки, необходимо заменить BoundField или CheckBoxField на TemplateField. TemplateFields, которые были предметом обсуждения в разделах Using TemplateFields в элементе управления GridView и Using TemplateFields в учебниках DetailsView Control , могут состоять из нескольких шаблонов, определяющих отдельные интерфейсы для разных состояний строк. TemplateField ItemTemplate используется для при отрисовке полей или строк, доступных только для чтения, в элементах EditItemTemplate управления DetailsView или GridView, тогда как и InsertItemTemplate указывают интерфейсы, используемые для режимов редактирования и вставки соответственно.

В этом руководстве мы посмотрим, насколько просто добавить элементы управления проверки в TemplateField EditItemTemplate и InsertItemTemplate обеспечить более надежную пользовательский интерфейс. В частности, в этом руководстве используется пример, созданный в учебнике Изучение событий, связанных с вставкой, обновлением и удалением, и дополняет интерфейсы редактирования и вставки, чтобы включить соответствующую проверку.

Шаг 1. Репликация примера изизучения событий, связанных с вставкой, обновлением и удалением

В учебнике Изучение событий, связанных с вставкой, обновлением и удалением, мы создали страницу со списком названий и цен на продукты в редактируемом gridView. Кроме того, страница включала DetailsView, свойству которого DefaultMode было присвоено значение Insert, поэтому всегда отрисовка в режиме вставки. В этом представлении DetailsView пользователь может ввести имя и цену нового продукта, нажать кнопку Вставить и добавить его в систему (см. рис. 1).

Предыдущий пример позволяет пользователям добавлять новые продукты и изменять существующие

Рис. 1. Предыдущий пример позволяет пользователям добавлять новые продукты и изменять существующие (щелкните для просмотра полноразмерного изображения)

Наша цель в этом руководстве — дополнить DetailsView и GridView для предоставления элементов управления проверкой. В частности, наша логика проверки:

  • Требовать, чтобы при вставке или редактировании продукта указывалось имя
  • Требовать, чтобы цена была указана при вставке записи; При редактировании записи нам по-прежнему потребуется цена, но мы будем использовать программную логику в обработчике событий GridView RowUpdating , который уже присутствует в предыдущем руководстве.
  • Убедитесь, что значение, введенное для цены, является допустимым форматом валюты

Прежде чем мы рассмотрим расширение предыдущего примера для включения проверки, необходимо сначала реплицировать пример со DataModificationEvents.aspx страницы на страницу этого учебника UIValidation.aspx. Для этого необходимо скопировать декларативную разметку DataModificationEvents.aspx страницы и ее исходный код. Сначала скопируйте декларативную разметку, выполнив следующие действия:

  1. Открытие страницы DataModificationEvents.aspx в Visual Studio
  2. Перейдите к декларативной разметке страницы (нажмите кнопку Источник в нижней части страницы).
  3. Скопируйте текст в тегах <asp:Content> и </asp:Content> (строки 3–44), как показано на рисунке 2.

Копирование текста в элементе <управления asp:Content>

Рис. 2. Копирование текста в элементе <asp:Content> управления (щелкните для просмотра полноразмерного изображения)

  1. Открытие страницы UIValidation.aspx
  2. Переход к декларативной разметке страницы
  3. Вставьте текст в элемент управления <asp:Content> .

Чтобы скопировать исходный код, откройте страницу DataModificationEvents.aspx.cs и скопируйте только текст вEditInsertDelete_DataModificationEvents классе . Скопируйте три обработчика событий (Page_Load, GridView1_RowUpdatingи ObjectDataSource1_Inserting), но не копируйте объявление класса или using операторы . Вставьте скопированный текст вEditInsertDelete_UIValidation класс в UIValidation.aspx.cs.

После перемещения по содержимому и коду из DataModificationEvents.aspx в на UIValidation.aspxукажите время, чтобы проверить ход выполнения в браузере. На каждой из этих двух страниц должны отображаться одинаковые выходные данные и одинаковые функциональные возможности (снимок экрана в действии DataModificationEvents.aspx см. на рис. 1).

Шаг 2. Преобразование BoundFields в templateFields

Чтобы добавить элементы управления проверки в интерфейсы редактирования и вставки, boundFields, используемые элементами управления DetailsView и GridView, необходимо преобразовать в TemplateFields. Для этого щелкните ссылки Изменить столбцы и Изменить поля в смарт-тегах GridView и DetailsView соответственно. Выберите каждое из полей BoundFields и щелкните ссылку "Преобразовать это поле в templateField".

Преобразование каждого из полей BoundField элемента DetailsView и GridView в templateFields

Рис. 3. Преобразование каждого из полей BoundFields DetailsView и GridView в TemplateFields (щелкните для просмотра полноразмерного изображения)

Преобразование BoundField в TemplateField с помощью диалогового окна Поля создает TemplateField, которое имеет те же интерфейсы только для чтения, редактирования и вставки, что и сам BoundField. В следующей разметке показан декларативный синтаксис поля ProductName в DetailsView после его преобразования в 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. отображает ItemTemplate одно значение поля данных (ProductName) с помощью веб-элемента управления Label, а EditItemTemplate и InsertItemTemplate представляют значение поля данных в веб-элементе управления TextBox, который связывает поле данных со свойством TextBox Text с помощью двусторонней привязки данных. Так как мы используем только DetailsView на этой странице для вставки, вы можете удалить ItemTemplate и EditItemTemplate из двух TemplateFields, хотя выход из них не повредит.

Так как GridView не поддерживает встроенные функции вставки DetailsView, преобразование поля GridView ProductName в TemplateField приводит только к и ItemTemplateEditItemTemplate:

<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. Это можно проверить, посетив эту страницу в браузере. Вы обнаружите, что внешний вид и поведение TemplateFields идентичны интерфейсу, когда вместо этого были использованы BoundFields.

Примечание

При необходимости вы можете настроить интерфейсы редактирования в шаблонах. Например, может потребоваться, чтобы элемент TextBox в UnitPrice TemplateFields отображался как меньшее текстовое поле, чем текстовое ProductName поле. Для этого можно задать для свойства TextBox Columns соответствующее значение или указать абсолютную ширину Width с помощью свойства . В следующем руководстве мы посмотрим, как полностью настроить интерфейс редактирования, заменив TextBox альтернативным веб-элементом управления для ввода данных.

Шаг 3. Добавление элементов управления проверкой в gridViewEditItemTemplate

При создании форм ввода данных важно, чтобы пользователи вводили все обязательные поля и чтобы все предоставленные входные данные были допустимыми и правильно отформатированными значениями. Чтобы обеспечить допустимость входных данных пользователя, ASP.NET предоставляет пять встроенных элементов управления проверкой, которые предназначены для проверки значения одного элемента управления входными данными:

  • RequiredFieldValidator гарантирует, что указано значение.
  • CompareValidator проверяет значение на соответствие другому значению веб-элемента управления или постоянному значению или гарантирует, что формат значения является допустимым для указанного типа данных.
  • RangeValidator гарантирует, что значение находится в диапазоне значений
  • RegularExpressionValidator проверяет значение на соответствие регулярному выражению
  • CustomValidator проверяет значение на соответствие пользовательскому, определяемого пользователем методу

Дополнительные сведения об этих пяти элементах управления проверка в разделе Элементы управления проверкойв ASP.NET кратких руководств.

В нашем руководстве необходимо использовать RequiredFieldValidator в DetailsView и TemplateFieldField в GridView ProductName и RequiredFieldValidator в TemplateField DetailsView UnitPrice . Кроме того, нам потребуется добавить CompareValidator в templateFields обоих элементов управления UnitPrice , который гарантирует, что введенная цена имеет значение больше или равно 0 и будет представлена в допустимом формате валюты.

Примечание

Хотя в ASP.NET 1.x были те же пять элементов управления проверкой, в ASP.NET 2.0 добавлен ряд улучшений. Два main — поддержка клиентских скриптов для браузеров, отличных от Интернет-Обозреватель и возможность секционирования элементов управления проверкой на странице в группы проверки.

Для начала добавим необходимые элементы управления EditItemTemplate проверки в элементы в templateFields GridView. Для этого щелкните ссылку Изменить шаблоны в смарт-теге GridView, чтобы открыть интерфейс редактирования шаблона. Здесь можно выбрать шаблон для редактирования в раскрывающемся списке. Так как мы хотим расширить интерфейс редактирования, необходимо добавить элементы управления проверкой в ProductName и UnitPriceEditItemTemplate .

Нам нужно расширить ProductName и UnitPrice EditItemTemplates

Рис. 4. Нам нужно расширить ProductName и UnitPriceEditItemTemplate (щелкните, чтобы просмотреть полноразмерное изображение)

В добавьте ProductNameEditItemTemplateRequiredFieldValidator, перетащив его с панели элементов в интерфейс редактирования шаблона, поместив после элемента TextBox.

Добавление RequiredFieldValidator в productName EditItemTemplate

Рис. 5. Добавление RequiredFieldValidator в ProductNameEditItemTemplate (щелкните для просмотра полноразмерного изображения)

Все элементы управления проверки работают путем проверки входных данных одного веб-элемента управления ASP.NET. Поэтому необходимо указать, что только что добавленный параметр RequiredFieldValidator должен проверяться на соответствие TextBox в EditItemTemplate; для этого необходимо задать для свойства ControlToValidate элемента управления проверки значение ID соответствующего веб-элемента управления. TextBox в настоящее время имеет довольно невзрачный IDTextBox1знак , но давайте изменим его на что-то более подходящее. Щелкните элемент TextBox в шаблоне, а затем в окно свойств измените с TextBox1 на IDEditProductName.

Измените идентификатор TextBox на EditProductName.

Рис. 6. Изменение элемента TextBox ID на EditProductName (щелкните для просмотра полноразмерного изображения)

Затем задайте для свойства RequiredFieldValidator ControlToValidate значение EditProductName. Наконец, задайте для свойства ErrorMessage значение "Необходимо указать название продукта", а для свойства Text — значение "*". Значение Text свойства, если указано, — это текст, отображаемый элементом управления проверки в случае сбоя проверки. Обязательное ErrorMessage значение свойства используется элементом управления ValidationSummary. Если Text значение свойства опущено, значение свойства также является текстом, ErrorMessage отображаемым элементом управления проверки при недопустимых входных данных.

После установки этих трех свойств RequiredFieldValidator экран должен выглядеть примерно так, как на рис. 7.

Задание свойств ControlToValidate, ErrorMessage и Text requiredFieldValidator

Рис. 7. Задание свойств RequiredFieldValidator ControlToValidate, ErrorMessageи Text (щелкните для просмотра полноразмерного изображения)

После добавления RequiredFieldValidator в ProductNameEditItemTemplate, остается только добавить необходимую проверку в UnitPriceEditItemTemplate. Так как мы решили, что для этой страницы UnitPrice является необязательным при редактировании записи, нам не нужно добавлять RequiredFieldValidator. Однако нам нужно добавить CompareValidator, чтобы убедиться, что UnitPrice, если он указан, правильно отформатирован как валюта и больше или равен 0.

Прежде чем добавить CompareValidator в UnitPriceEditItemTemplate, давайте сначала изменим идентификатор веб-элемента управления TextBox с TextBox2 на EditUnitPrice. После внесения этого изменения добавьте CompareValidator, задав его ControlToValidate свойству EditUnitPriceзначение , его ErrorMessage свойству значение "Цена должна быть больше или равна нулю и не может включать символ валюты" и его Text свойству значение "*".

Чтобы указать, что UnitPrice значение должно быть больше или равно 0, задайте свойству Оператора CompareValidator значение GreaterThanEqual, свойству ValueToCompare значение "0", а свойству Type — значение Currency. Следующий декларативный синтаксис показывает UnitPrice шаблон TemplateField EditItemTemplate после внесения этих изменений:

<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>

После внесения этих изменений откройте страницу в браузере. При попытке опустить имя или ввести недопустимое значение цены при редактировании продукта, рядом с текстовым полем появится звездочка. Как показано на рисунке 8, значение цены, включающее символ валюты, например 19,95 долл. США, считается недопустимым. Функция CompareValidator CurrencyType позволяет использовать разделители цифр (например, запятые или точки, в зависимости от параметров языка и региональных параметров) и начальный знак "плюс" или "минус", но не допускает символ валюты. Такое поведение может озадать пользователей, так как интерфейс редактирования в настоящее время отрисовывает UnitPrice с использованием формата валюты.

Примечание

Напомним, что в учебнике События, связанные с вставкой, обновлением и удалением, мы задали свойству {0:c} BoundField DataFormatString значение , чтобы отформатировать его в виде валюты. Кроме того, мы задаем свойству ApplyFormatInEditMode значение true, в результате чего интерфейс редактирования GridView будет форматировать как UnitPrice валюту. При преобразовании BoundField в TemplateField Visual Studio отметил эти параметры и отформатирует свойство TextBox Text в виде валюты с помощью синтаксиса <%# Bind("UnitPrice", "{0:c}") %>привязки данных .

Рядом с текстовыми полями с недопустимыми входными данными отображается звездочка

Рис. 8. Рядом с текстовыми полями с недопустимыми входными данными отображается звездочка (щелкните для просмотра полноразмерного изображения)

Пока проверка выполняется как есть, пользователь должен вручную удалить символ валюты при редактировании записи, что неприемлемо. Чтобы устранить эту проблему, у нас есть три варианта:

  1. Настройте , EditItemTemplate чтобы UnitPrice значение не было отформатировано в виде валюты.
  2. Разрешите пользователю ввести символ валюты, удалив CompareValidator и заменив его на RegularExpressionValidator, который правильно проверяет правильное значение валюты. Проблема заключается в том, что регулярное выражение для проверки значения валюты не является довольно и потребует написания кода, если мы хотим включить параметры языка и региональных параметров.
  3. Полностью удалите элемент управления проверкой и полагайтесь на логику проверки на стороне сервера в обработчике RowUpdating событий GridView.

Давайте перейдем к варианту 1 для этого упражнения. В настоящее UnitPrice время имеет формат валюты из-за выражения привязки данных для TextBox в EditItemTemplate: <%# Bind("UnitPrice", "{0:c}") %>. Измените оператор Bind на Bind("UnitPrice", "{0:n2}"), который форматирует результат в виде числа с двумя цифрами точности. Это можно сделать непосредственно с помощью декларативного синтаксиса EditItemTemplate или щелкнув ссылку Изменить DataBindings из EditUnitPrice TextBox в UnitPrice TemplateField (см. рис. 9 и 10).

Щелкните ссылку Edit DataBindings в TextBox.

Рис. 9. Щелкните ссылку TextBox Edit DataBindings (Щелкните для просмотра полноразмерного изображения)

Укажите описатель формата в операторе Bind.

Рис. 10. Указание описатель формата в инструкции Bind (щелкните для просмотра полноразмерного изображения)

После этого изменения форматированная цена в интерфейсе редактирования включает запятые в качестве разделителя групп и точку в качестве десятичного разделителя, но не включает символ валюты.

Примечание

Не UnitPriceEditItemTemplate включает RequiredFieldValidator, что позволяет выполнить обратную передачу и начать обновление логики. Однако обработчик событий, RowUpdating скопированный из учебника Изучение событий, связанных с вставкой, обновлением и удалением, включает программную проверка, которая гарантирует, что UnitPrice предоставляется . Вы можете удалить эту логику, оставить ее в режиме "как есть" или добавить RequiredFieldValidator в UnitPriceEditItemTemplate.

Шаг 4. Суммирование проблем с вводом данных

Помимо пяти элементов управления проверкой, ASP.NET включает элемент управления ValidationSummary, который отображает ErrorMessage элементы управления проверки, которые обнаружили недопустимые данные. Эти сводные данные могут отображаться в виде текста на веб-странице или через модальное клиентское окно сообщений. Давайте дополним это руководство, включив в него клиентское окно сообщений, в котором содержатся сведения о любых проблемах проверки.

Для этого перетащите элемент управления ValidationSummary из панели элементов на Designer. Расположение элемента управления Проверка на самом деле не имеет значения, так как мы собираемся настроить его для отображения сводки только в виде сообщения. После добавления элемента управления задайте для свойства ShowSummary значениеfalse , а для свойства ShowMessageBox — значение true. С этим добавлением все ошибки проверки суммируются в клиентском поле сообщений.

Сведения об ошибках проверки приведены в Client-Side messagebox

Рис. 11. Сведения об ошибках проверки приведены в Client-Side окне сообщений (щелкните для просмотра полноразмерного изображения)

Шаг 5. Добавление элементов управления проверкой в DetailsViewInsertItemTemplate

В этом руководстве осталось добавить элементы управления проверкой в интерфейс вставки DetailsView. Процесс добавления элементов управления проверки в шаблоны DetailsView идентичен процессу, рассмотренным на шаге 3; поэтому мы подробно рассмотрим задачу на этом шаге. Как и в случае с GridView EditItemTemplate , я призываю вас переименовать ID элементы TextBoxes с невзрачного TextBox1 и TextBox2 на InsertProductName и InsertUnitPrice.

Добавьте RequiredFieldValidator в ProductNameInsertItemTemplate. Присвойте ControlToValidate свойству ID свойство TextBox в шаблоне, а свойству — значение "*", Text а свойству ErrorMessage — значение "Необходимо указать имя продукта".

UnitPrice Так как для этой страницы требуется при добавлении новой записи, добавьте RequiredFieldValidator вInsertItemTemplateUnitPrice , задав соответствующим образом его ControlToValidateсвойства , Textи ErrorMessage . Наконец, добавьте CompareValidator в , настроив его ControlToValidateсвойства , TextErrorMessage, , Type, Operatorи ValueToCompare так же, как это было с UnitPriceCompareValidator в GridView EditItemTemplate.UnitPriceInsertItemTemplate

После добавления этих элементов контроля проверки новый продукт не может быть добавлен в систему, если его имя не предоставлено или если его цена является отрицательным числом или незаконно форматирована.

Логика проверки добавлена в интерфейс вставки DetailsView

Рис. 12. Логика проверки добавлена в интерфейс вставки DetailsView (щелкните для просмотра полноразмерного изображения)

Шаг 6. Секционирование элементов управления проверкой на группы проверки

Наша страница состоит из двух логически разрозненных наборов элементов управления проверкой: те, которые соответствуют интерфейсу редактирования GridView и те, которые соответствуют интерфейсу вставки DetailsView. По умолчанию при обратной отправке проверяются все элементы управления проверки на странице. Однако при редактировании записи мы не хотим, чтобы элементы управления проверки вставляемого интерфейса DetailsView проверяли. На рисунке 13 показана наша текущая дилемма, когда пользователь редактирует продукт с совершенно законными значениями. Нажатие кнопки Обновить приводит к ошибке проверки, так как имя и значения цены в интерфейсе вставки пусты.

Обновление продукта приводит к срабатыванию элементов управления проверки в интерфейсе вставки

Рис. 13. Обновление продукта приводит к срабатыванию элементов управления проверкой в интерфейсе вставки (щелкните для просмотра полноразмерного изображения)

Элементы управления проверкой в ASP.NET 2.0 можно разделить на группы проверки с помощью их ValidationGroup свойства. Чтобы связать набор элементов управления проверкой в группе, просто присвойте их ValidationGroup свойству то же значение. В нашем руководстве ValidationGroup задайте свойствам элементов управления проверки в Полях шаблонов GridView значение EditValidationControls , а ValidationGroup свойствам TemplateFields DetailsView — значение InsertValidationControls. Эти изменения можно выполнить непосредственно в декларативной разметке или с помощью окно свойств при использовании интерфейса шаблона редактирования Designer.

Помимо элементов управления проверкой, элементы управления Button и Button в ASP.NET 2.0 также включают ValidationGroup свойство . Проверяющие элементы группы проверки проверяются на допустимость только в том случае, если обратная связь вызвана кнопкой с таким же ValidationGroup параметром свойства. Например, чтобы кнопка Insert в DetailsView активировала InsertValidationControls группу проверки, необходимо задать свойству InsertValidationControls CommandField ValidationGroup значение (см. рис. 14). Кроме того, задайте свойству CommandField ValidationGroup элемента GridView значение EditValidationControls.

Присвойте свойству DetailsView CommandField's ValidationGroup значение InsertValidationControls.

Рис. 14. Задайте для свойства InsertValidationControls DetailsView's ValidationGroup CommandField значение (Щелкните для просмотра полноразмерного изображения)

После этих изменений поля шаблонов DetailsView и GridView и CommandFields должны выглядеть примерно так:

Поля шаблонов DetailsView и 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 для GridView

<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>

На этом этапе элементы управления проверкой, относящиеся к редактированию, срабатают только при нажатии кнопки Update GridView, а элементы управления проверки, относящиеся к вставке, срабатают только при нажатии кнопки Вставка DetailsView, что позволяет устранить проблему, выделенную на рис. 13. Однако с этим изменением наш элемент управления ValidationSummary больше не отображается при вводе недопустимых данных. Элемент управления ValidationSummary также содержит ValidationGroup свойство и отображает сводные сведения только для этих элементов управления в своей группе проверки. Поэтому на этой странице необходимо иметь два элемента управления проверки: один для InsertValidationControls группы проверки и один для 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" />

С этим дополнением наше руководство завершено!

Сводка

Хотя BoundFields может предоставлять интерфейс вставки и редактирования, он не настраивается. Как правило, мы хотим добавить элементы управления проверкой в интерфейс редактирования и вставки, чтобы убедиться, что пользователь вводит необходимые входные данные в законном формате. Для этого необходимо преобразовать BoundFields в TemplateFields и добавить элементы управления проверки в соответствующие шаблоны. В этом руководстве мы расширили пример из учебника Изучение событий, связанных с вставкой, обновлением и удалением , добавив элементы управления проверкой как в интерфейс вставки DetailsView, так и в интерфейс редактирования GridView. Кроме того, мы узнали, как отобразить сводные сведения о проверке с помощью элемента управления ValidationSummary и как разделить элементы управления проверкой на странице на отдельные группы проверки.

Как мы видели в этом руководстве, TemplateFields позволяет дополнить интерфейсы редактирования и вставки, чтобы включить элементы управления проверкой. TemplateFields также можно расширить для включения дополнительных веб-элементов управления ввода, что позволяет заменить TextBox более подходящим веб-элементом управления. В следующем руководстве мы посмотрим, как заменить элемент управления TextBox элементом управления DropDownList с привязкой к данным, который идеально подходит при редактировании внешнего ключа (например CategoryID , или SupplierID в Products таблице).

Счастливого программирования!

Об авторе

Скотт Митчелл( Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часах. Он может быть доступен в mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Отдельная благодарность

Эта серия учебников была проверена многими полезными рецензентами. Ведущие рецензенты этого руководства — Лиз Шулок и Зак Джонс. Хотите ознакомиться с моими предстоящими статьями MSDN? Если да, опустите мне строку в mitchell@4GuysFromRolla.com.