Добавление элементов управления проверки в интерфейсы правки и вставки (C#)
В этом руководстве мы посмотрим, как легко добавить элементы управления проверки в 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
страницы и ее исходный код. Сначала скопируйте декларативную разметку, выполнив следующие действия:
- Открытие страницы
DataModificationEvents.aspx
в Visual Studio - Перейдите к декларативной разметке страницы (нажмите кнопку Источник в нижней части страницы).
- Скопируйте текст в тегах
<asp:Content>
и</asp:Content>
(строки 3–44), как показано на рисунке 2.
Рис. 2. Копирование текста в элементе <asp:Content>
управления (щелкните для просмотра полноразмерного изображения)
- Открытие страницы
UIValidation.aspx
- Переход к декларативной разметке страницы
- Вставьте текст в элемент управления
<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".
Рис. 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 приводит только к и 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 создала 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
и UnitPrice
EditItemTemplate
.
Рис. 4. Нам нужно расширить ProductName
и UnitPrice
EditItemTemplate
(щелкните, чтобы просмотреть полноразмерное изображение)
В добавьте ProductName
EditItemTemplate
RequiredFieldValidator, перетащив его с панели элементов в интерфейс редактирования шаблона, поместив после элемента TextBox.
Рис. 5. Добавление RequiredFieldValidator в ProductName
EditItemTemplate
(щелкните для просмотра полноразмерного изображения)
Все элементы управления проверки работают путем проверки входных данных одного веб-элемента управления ASP.NET. Поэтому необходимо указать, что только что добавленный параметр RequiredFieldValidator должен проверяться на соответствие TextBox в EditItemTemplate
; для этого необходимо задать для свойства ControlToValidate элемента управления проверки значение ID
соответствующего веб-элемента управления. TextBox в настоящее время имеет довольно невзрачный ID
TextBox1
знак , но давайте изменим его на что-то более подходящее. Щелкните элемент TextBox в шаблоне, а затем в окно свойств измените с TextBox1
на ID
EditProductName
.
Рис. 6. Изменение элемента TextBox ID
на EditProductName
(щелкните для просмотра полноразмерного изображения)
Затем задайте для свойства RequiredFieldValidator ControlToValidate
значение EditProductName
. Наконец, задайте для свойства ErrorMessage значение "Необходимо указать название продукта", а для свойства Text — значение "*". Значение Text
свойства, если указано, — это текст, отображаемый элементом управления проверки в случае сбоя проверки. Обязательное ErrorMessage
значение свойства используется элементом управления ValidationSummary. Если Text
значение свойства опущено, значение свойства также является текстом, ErrorMessage
отображаемым элементом управления проверки при недопустимых входных данных.
После установки этих трех свойств RequiredFieldValidator экран должен выглядеть примерно так, как на рис. 7.
Рис. 7. Задание свойств RequiredFieldValidator ControlToValidate
, ErrorMessage
и Text
(щелкните для просмотра полноразмерного изображения)
После добавления RequiredFieldValidator в ProductName
EditItemTemplate
, остается только добавить необходимую проверку в UnitPrice
EditItemTemplate
. Так как мы решили, что для этой страницы UnitPrice
является необязательным при редактировании записи, нам не нужно добавлять RequiredFieldValidator. Однако нам нужно добавить CompareValidator, чтобы убедиться, что UnitPrice
, если он указан, правильно отформатирован как валюта и больше или равен 0.
Прежде чем добавить CompareValidator в UnitPrice
EditItemTemplate
, давайте сначала изменим идентификатор веб-элемента управления 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 Currency
Type
позволяет использовать разделители цифр (например, запятые или точки, в зависимости от параметров языка и региональных параметров) и начальный знак "плюс" или "минус", но не допускает символ валюты. Такое поведение может озадать пользователей, так как интерфейс редактирования в настоящее время отрисовывает UnitPrice
с использованием формата валюты.
Примечание
Напомним, что в учебнике События, связанные с вставкой, обновлением и удалением, мы задали свойству {0:c}
BoundField DataFormatString
значение , чтобы отформатировать его в виде валюты. Кроме того, мы задаем свойству ApplyFormatInEditMode
значение true, в результате чего интерфейс редактирования GridView будет форматировать как UnitPrice
валюту. При преобразовании BoundField в TemplateField Visual Studio отметил эти параметры и отформатирует свойство TextBox Text
в виде валюты с помощью синтаксиса <%# Bind("UnitPrice", "{0:c}") %>
привязки данных .
Рис. 8. Рядом с текстовыми полями с недопустимыми входными данными отображается звездочка (щелкните для просмотра полноразмерного изображения)
Пока проверка выполняется как есть, пользователь должен вручную удалить символ валюты при редактировании записи, что неприемлемо. Чтобы устранить эту проблему, у нас есть три варианта:
- Настройте ,
EditItemTemplate
чтобыUnitPrice
значение не было отформатировано в виде валюты. - Разрешите пользователю ввести символ валюты, удалив CompareValidator и заменив его на RegularExpressionValidator, который правильно проверяет правильное значение валюты. Проблема заключается в том, что регулярное выражение для проверки значения валюты не является довольно и потребует написания кода, если мы хотим включить параметры языка и региональных параметров.
- Полностью удалите элемент управления проверкой и полагайтесь на логику проверки на стороне сервера в обработчике
RowUpdating
событий GridView.
Давайте перейдем к варианту 1 для этого упражнения. В настоящее UnitPrice
время имеет формат валюты из-за выражения привязки данных для TextBox в EditItemTemplate
: <%# Bind("UnitPrice", "{0:c}") %>
. Измените оператор Bind на Bind("UnitPrice", "{0:n2}")
, который форматирует результат в виде числа с двумя цифрами точности. Это можно сделать непосредственно с помощью декларативного синтаксиса EditItemTemplate
или щелкнув ссылку Изменить DataBindings из EditUnitPrice
TextBox в UnitPrice
TemplateField (см. рис. 9 и 10).
Рис. 9. Щелкните ссылку TextBox Edit DataBindings (Щелкните для просмотра полноразмерного изображения)
Рис. 10. Указание описатель формата в инструкции Bind
(щелкните для просмотра полноразмерного изображения)
После этого изменения форматированная цена в интерфейсе редактирования включает запятые в качестве разделителя групп и точку в качестве десятичного разделителя, но не включает символ валюты.
Примечание
Не UnitPrice
EditItemTemplate
включает RequiredFieldValidator, что позволяет выполнить обратную передачу и начать обновление логики. Однако обработчик событий, RowUpdating
скопированный из учебника Изучение событий, связанных с вставкой, обновлением и удалением, включает программную проверка, которая гарантирует, что UnitPrice
предоставляется . Вы можете удалить эту логику, оставить ее в режиме "как есть" или добавить RequiredFieldValidator в UnitPrice
EditItemTemplate
.
Шаг 4. Суммирование проблем с вводом данных
Помимо пяти элементов управления проверкой, ASP.NET включает элемент управления ValidationSummary, который отображает ErrorMessage
элементы управления проверки, которые обнаружили недопустимые данные. Эти сводные данные могут отображаться в виде текста на веб-странице или через модальное клиентское окно сообщений. Давайте дополним это руководство, включив в него клиентское окно сообщений, в котором содержатся сведения о любых проблемах проверки.
Для этого перетащите элемент управления ValidationSummary из панели элементов на Designer. Расположение элемента управления Проверка на самом деле не имеет значения, так как мы собираемся настроить его для отображения сводки только в виде сообщения. После добавления элемента управления задайте для свойства ShowSummary значениеfalse
, а для свойства ShowMessageBox — значение true
. С этим добавлением все ошибки проверки суммируются в клиентском поле сообщений.
Рис. 11. Сведения об ошибках проверки приведены в Client-Side окне сообщений (щелкните для просмотра полноразмерного изображения)
Шаг 5. Добавление элементов управления проверкой в DetailsViewInsertItemTemplate
В этом руководстве осталось добавить элементы управления проверкой в интерфейс вставки DetailsView. Процесс добавления элементов управления проверки в шаблоны DetailsView идентичен процессу, рассмотренным на шаге 3; поэтому мы подробно рассмотрим задачу на этом шаге. Как и в случае с GridView EditItemTemplate
, я призываю вас переименовать ID
элементы TextBoxes с невзрачного TextBox1
и TextBox2
на InsertProductName
и InsertUnitPrice
.
Добавьте RequiredFieldValidator в ProductName
InsertItemTemplate
. Присвойте ControlToValidate
свойству ID
свойство TextBox в шаблоне, а свойству — значение "*", Text
а свойству ErrorMessage
— значение "Необходимо указать имя продукта".
UnitPrice
Так как для этой страницы требуется при добавлении новой записи, добавьте RequiredFieldValidator вInsertItemTemplate
UnitPrice
, задав соответствующим образом его ControlToValidate
свойства , Text
и ErrorMessage
. Наконец, добавьте CompareValidator в , настроив его ControlToValidate
свойства , Text
ErrorMessage
, , Type
, Operator
и ValueToCompare
так же, как это было с UnitPrice
CompareValidator в GridView EditItemTemplate
.UnitPrice
InsertItemTemplate
После добавления этих элементов контроля проверки новый продукт не может быть добавлен в систему, если его имя не предоставлено или если его цена является отрицательным числом или незаконно форматирована.
Рис. 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
.
Рис. 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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по