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


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

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

Скачать в формате PDF

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

Введение

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

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

Чтобы предоставить настраиваемый интерфейс редактирования или вставки, необходимо заменить BoundField или CheckBoxField на TemplateField. TemplateFields, который был темой обсуждения в разделе Using TemplateFields в элементе управления GridView и Using TemplateFields в руководствах по элементу управления DetailsView, может состоять из нескольких шаблонов, определяющих отдельные интерфейсы для разных состояний строк. ШаблонField ItemTemplate используется для отрисовки полей или строк только для чтения в элементах управления DetailsView или GridView, а интерфейсы EditItemTemplate 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.vb страницу и скопируйте только текст в EditInsertDelete_DataModificationEvents классе. Скопируйте три обработчика событий (Page_LoadиGridView1_RowUpdatingObjectDataSource1_Inserting), но не копируйте объявление класса. Вставьте скопированный текст в EditInsertDelete_UIValidation класс UIValidation.aspx.vb.

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

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

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

Преобразование каждого элемента DetailsView и GridView в BoundFields в TemplateFields

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

Преобразование BoundField в 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>

Обратите внимание, что в этом шаблоне было создано три шаблона ItemTemplate, EditItemTemplateа также InsertItemTemplate. Отображается ItemTemplate одно значение поля данных (ProductName) с помощью веб-элемента управления Label, а также InsertItemTemplate EditItemTemplate значение поля данных в веб-элементе управления TextBox, которое связывает поле данных со свойством TextBox Text с помощью двусторонней привязки данных. Так как мы используем только DetailsView на этой странице для вставки, вы можете удалить ItemTemplate и EditItemTemplate из двух templateFields, хотя их не причиняет никакого вреда.

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

Примечание.

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

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

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

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

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

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

Примечание.

Хотя ASP.NET 1.x имели те же пять элементов управления проверки, ASP.NET 2.0 добавил ряд улучшений, основные два из которых поддерживают клиентские скрипты для браузеров, отличных от Internet Explorer, и возможность секционировать элементы управления проверкой на странице в группы проверки. Дополнительные сведения о новых функциях управления проверкой в версии 2.0 см. в разделе "Рассекать элементы управления проверкой" в ASP.NET 2.0.

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

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

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

В поле ProductName EditItemTemplate"Добавить ОбязательныйFieldValidator", перетащив его из панели элементов в интерфейс редактирования шаблона, поместив после текстового поля.

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

Рис. 5. Добавление ОбязательногоFieldValidator в файл ProductName EditItemTemplate (щелкните, чтобы просмотреть изображение полного размера)

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

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

Рис. 6. Измените текстовое поле ID EditProductName на (щелкните, чтобы просмотреть изображение полного размера)

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

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

Задание свойств controlToValidator RequiredFieldValidator, ErrorMessage и Text

Рис. 7. Задание элемента "ОбязательныйFieldValidator" ErrorMessageControlToValidateи Text "Свойства" (щелкните, чтобы просмотреть изображение полного размера)

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

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

Чтобы указать, что UnitPrice значение должно быть больше или равно 0, задайте для свойства GreaterThanEqual Оператора CompareValidator значение , его свойство ValueToCompare равно "0" и его свойству CurrencyType значение . В следующем декларативном синтаксисе показано 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 Currency Type позволяет разделителям цифр (например, запятыми или точками в зависимости от параметров языка и региональных параметров) и ведущим знаком плюса или минуса, но не допускает символ валюты. Это поведение может запутать пользователей, так как интерфейс редактирования в настоящее время отображает UnitPrice формат валюты.

Примечание.

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

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

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

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

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

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

Щелкните ссылку

Рис. 9. Щелкните ссылку "Изменить DataBindings" в Текстовом поле (щелкните, чтобы просмотреть изображение полного размера)

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

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

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

Примечание.

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

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

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

Для этого перетащите элемент управления ValidationSummary из панели элементов в конструктор. Расположение элемента управления "Проверка" не имеет значения, так как мы настроим его только для отображения сводки в виде почтового ящика. После добавления элемента управления задайте для свойства ShowSummary False значение и его свойство TrueShowMessageBox. При этом все ошибки проверки суммируются в клиентском почтовом ящике сообщений.

Ошибки проверки суммируются в папке сообщений на стороне клиента

Рис. 11. Ошибки проверки суммируются в папке сообщений на стороне клиента (щелкните, чтобы просмотреть изображение полного размера)

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

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

Добавьте ОбязательныйFieldValidator в объект ProductName InsertItemTemplate. ControlToValidate ID Задайте для параметра TextBox в шаблоне значение Text "*" и его ErrorMessage свойство "Необходимо указать имя продукта".

UnitPrice Так как для этой страницы требуется при добавлении новой записи, добавьте ОбязательныйFieldValidator в InsertItemTemplateUnitPrice объект, задав его ControlToValidateи TextErrorMessage свойства соответствующим образом. Наконец, добавьте CompareValidator в также, настроив его ControlToValidate, Text, ErrorMessageTypeи OperatorValueToCompare свойства, как мы сделали с UnitPrice"CompareValidator UnitPrice InsertItemTemplate в GridViewEditItemTemplate".

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

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

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

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

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

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

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

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

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

Задайте для свойства CommandField CommandField свойства CommandField значение InsertValidationControls

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

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

TemplateFields и CommandField в DetailsView

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

На этом этапе элементы управления проверкой, относящиеся к редактированию, запускаются только при нажатии кнопки "Обновление 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 элементом управления DropDownList с привязкой к данным, который идеально подходит при редактировании внешнего ключа (напримерCategoryID, в Products таблице).SupplierID

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

Об авторе

Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.

Особое спасибо

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