Настройка интерфейса изменения данных (VB)

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

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

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

Введение

BoundFields и CheckBoxFields, используемые элементами управления GridView и DetailsView, упрощают процесс изменения данных благодаря возможности отрисовки интерфейсов только для чтения, редактируемых и вставляемых интерфейсов. Эти интерфейсы можно визуализировать без добавления дополнительной декларативной разметки или кода. Однако интерфейсы BoundField и CheckBoxField не имеют возможности настройки, которые часто требуются в реальных сценариях. Чтобы настроить редактируемый или вставляемый интерфейс в GridView или DetailsView, необходимо использовать TemplateField.

В предыдущем руководстве мы узнали, как настроить интерфейсы изменения данных путем добавления веб-элементов управления проверки. В этом руководстве мы рассмотрим, как настроить фактические веб-элементы управления сбора данных, заменив стандартные элементы управления TextBox и CheckBoxField BoundField и CheckBoxField альтернативными входными веб-элементами управления. В частности, мы создадим редактируемое представление GridView, которое позволяет обновлять имя продукта, категорию, поставщик и состояние прекращения. При редактировании определенной строки поля категории и поставщика будут отображаться как DropDownLists, содержащие набор доступных категорий и поставщиков на выбор. Кроме того, мы заменим checkBox По умолчанию CheckBoxField элементом управления RadioButtonList, который предлагает два варианта: "Активный" и "Прекращено".

Интерфейс редактирования GridView включает раскрывающийся список и переключатели

Рис. 1. Интерфейс редактирования GridView включает dropDownLists и RadioButtons (щелкните для просмотра полноразмерного изображения)

Шаг 1. Создание соответствующейUpdateProductперегрузки

В этом руководстве мы создадим редактируемый Элемент GridView, который позволяет изменять название продукта, категорию, поставщик и состояние неподдерживаемого продукта. Поэтому нам нужна перегрузка UpdateProduct , которая принимает пять входных параметров этих четырех значений ProductIDпродукта плюс . Как и в предыдущих перегрузках, эта будет:

  1. Получение сведений о продукте из базы данных для указанного ProductIDобъекта .
  2. Обновите ProductNameполя , CategoryID, SupplierIDи Discontinued , и
  3. Отправьте запрос на обновление в DAL с помощью метода TableAdapter Update() .

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

В следующем коде показана новая UpdateProduct перегрузка ProductsBLL в классе :

<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, False)>
Public Function UpdateProduct(
    ByVal productName As String, ByVal categoryID As Nullable(Of Integer), 
    ByVal supplierID As Nullable(Of Integer), ByVal discontinued As Boolean, 
    ByVal productID As Integer)
    As Boolean
    Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    product.ProductName = productName
    If Not supplierID.HasValue Then
        product.SetSupplierIDNull()
    Else
        product.SupplierID = supplierID.Value
    End If
    If Not categoryID.HasValue Then
        product.SetCategoryIDNull()
    Else
        product.CategoryID = categoryID.Value
    End If
    product.Discontinued = discontinued
    Dim rowsAffected As Integer = Adapter.Update(product)
    Return rowsAffected = 1
End Function

Шаг 2. Создание редактируемого элемента GridView

После добавления перегрузки UpdateProduct мы готовы создать редактируемый GridView. Откройте страницу CustomizedUI.aspx в папке EditInsertDelete и добавьте элемент управления GridView в Designer. Затем создайте объект ObjectDataSource из смарт-тега GridView. Настройте ObjectDataSource для получения сведений о продукте ProductBLL с помощью метода класса GetProducts() и обновления данных продукта с помощью только что созданной UpdateProduct перегрузки. На вкладках ВСТАВКА и УДАЛЕНИЕ выберите (Нет) в раскрывающихся списках.

Настройка ObjectDataSource для использования только что созданной перегрузки UpdateProduct

Рис. 2. Настройка ObjectDataSource для использования только что созданной UpdateProduct перегрузки (щелкните для просмотра полноразмерного изображения)

Как мы видели в руководствах по изменению данных, декларативный синтаксис для ObjectDataSource, созданного Visual Studio, назначает OldValuesParameterFormatString свойство .original_{0} Это, конечно, не будет работать с уровнем бизнес-логики, так как наши методы не ожидают, что исходное ProductID значение будет передано. Поэтому, как мы уже делали в предыдущих руководствах, уделите некоторое время, чтобы удалить это назначение свойства из декларативного синтаксиса или вместо этого присвойте этому свойству {0}значение .

После этого изменения декларативная разметка ObjectDataSource должна выглядеть следующим образом:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProducts" TypeName="ProductsBLL"
    UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="categoryID" Type="Int32" />
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="discontinued" Type="Boolean" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Обратите внимание, что OldValuesParameterFormatString свойство было удалено и что в UpdateParameters коллекции есть Parameter объект для каждого из входных параметров, ожидаемых перегрузкойUpdateProduct.

Хотя ObjectDataSource настроен для обновления только подмножества значений продукта, в GridView в настоящее время отображаются все поля продукта. Отредактируйте GridView, чтобы:

  • Он включает ProductNameтолько , SupplierName, CategoryName BoundFields и Discontinued CheckBoxField
  • Поля CategoryName и SupplierName , отображаемые перед (слева) Discontinued CheckBoxField
  • Для CategoryName свойства и SupplierName BoundFields заданы HeaderText значения "Category" и "Supplier" соответственно
  • Поддержка редактирования включена (проверка флажок Включить редактирование в смарт-теге GridView)

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

Удаление ненужных полей из GridView

Рис. 3. Удаление ненужных полей из GridView (щелкните для просмотра полноразмерного изображения)

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
    <Columns>
        <asp:BoundField DataField="ProductName"
           HeaderText="ProductName" SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
           ReadOnly="True"
           SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier"
           ReadOnly="True"
           SortExpression="SupplierName" />
        <asp:CheckBoxField DataField="Discontinued"
           HeaderText="Discontinued" SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

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

Интерфейс Read-Only GridView завершен

Рис. 4. Интерфейс Read-Only GridView завершен (щелкните, чтобы просмотреть полноразмерное изображение)

Примечание

Как описано в руководстве Общие сведения о вставке, обновлении и удалении данных, крайне важно включить состояние представления GridView (поведение по умолчанию). Если для свойства falseGridView задано EnableViewState значение , возникает риск того, что параллельные пользователи непреднамеренно удаляют или редактируют записи.

Шаг 3. Использование раскрывающегося списка для интерфейсов редактирования категорий и поставщиков

Напомним, что ProductsRow объект содержит CategoryIDсвойства , CategoryName, SupplierIDи SupplierName , которые предоставляют фактические значения идентификаторов внешнего ключа в Products таблице базы данных и соответствующие Name значения в Categories таблицах и Suppliers . CategoryIDSupplierID И ProductRowмогут считываться из и записываться в , а CategoryName свойства и SupplierName помечаются как доступные только для чтения.

Из-за состояния CategoryName только для чтения свойств и SupplierName соответствующие BoundFields имеют ReadOnly значение True, что предотвращает изменение этих значений при изменении строки. Хотя мы можем присвоить свойству ReadOnly значение False, отрисовка CategoryName и SupplierName BoundFields как TextBoxes во время редактирования, такой подход приведет к исключению, когда пользователь попытается обновить продукт, так как нет UpdateProduct перегрузки, принимающей CategoryName входные данные и SupplierName . На самом деле мы не хотим создавать такую перегрузку по двум причинам:

  • В Products таблице нет SupplierName полей или CategoryName , но SupplierID и CategoryID. Поэтому мы хотим, чтобы наш метод передавал эти конкретные значения идентификаторов, а не значения таблиц подстановки.
  • Требовать от пользователя ввода имени поставщика или категории меньше, чем идеально, так как это требует от пользователя знать доступные категории и поставщиков и их правильное написание.

В полях "Поставщик" и "Категория" должны отображаться категория и имена поставщиков в режиме только для чтения (как сейчас) и раскрывающийся список применимых параметров при редактировании. С помощью раскрывающегося списка конечный пользователь может быстро увидеть, какие категории и поставщики доступны для выбора, и может легко сделать выбор.

Чтобы обеспечить такое поведение, необходимо преобразовать SupplierName и CategoryName BoundFields в TemplateFields, которые ItemTemplate выдают SupplierName значения и и CategoryName используют EditItemTemplate элемент управления DropDownList для перечисления доступных категорий и поставщиков.

Добавление раскрывающихсяCategoriesсписков иSuppliers

Начните с преобразования SupplierName и CategoryName BoundFields в TemplateFields, щелкнув ссылку Изменить столбцы из смарт-тега GridView, выбрав BoundField из списка в левом нижнем левом списке и щелкнув ссылку "Преобразовать это поле в TemplateField". Процесс преобразования создаст TemplateField с ItemTemplate и EditItemTemplate, как показано в декларативном синтаксисе ниже:

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

Так как BoundField был помечен как доступный только для чтения, и ItemTemplateEditItemTemplate содержат веб-элемент управления Label Web, свойство которого Text привязано к соответствующему полю данных (CategoryNameв синтаксисе выше). Необходимо изменить EditItemTemplate, заменив элемент управления Label Web элементом управления DropDownList.

Как мы видели в предыдущих руководствах, шаблон можно изменить с помощью Designer или непосредственно из декларативного синтаксиса. Чтобы изменить его с помощью Designer, щелкните ссылку Изменить шаблоны в смарт-теге GridView и выберите для работы с полем EditItemTemplateКатегория . Удалите элемент управления Label Web и замените его элементом управления DropDownList, присвоив свойству Идентификатор DropDownList значение Categories.

Удалите элемент TexBox и добавьте раскрывающийся список в элемент EditItemTemplate.

Рис. 5. Удаление TexBox и добавление раскрывающегося списка в EditItemTemplate (щелкните для просмотра полноразмерного изображения)

Далее необходимо заполнить Раскрывающийся список доступными категориями. Щелкните ссылку Выбор источника данных в смарт-теге DropDownList и создайте объект ObjectDataSource с именем CategoriesDataSource.

Создание элемента управления ObjectDataSource с именем CategoriesDataSource

Рис. 6. Создание нового элемента управления ObjectDataSource с именем CategoriesDataSource (щелкните для просмотра полноразмерного изображения)

Чтобы объект ObjectDataSource вернул все категории, привяжите его к методу CategoriesBLLGetCategories() класса .

Привязка ObjectDataSource к методу GetCategories() в CategoriesBLL

Рис. 7. Привязка ObjectDataSource к методу CategoriesBLL(GetCategories()щелкните для просмотра полноразмерного изображения)

Наконец, настройте параметры DropDownList таким образом, чтобы CategoryName поле отображалось в каждом DropDownList ListItem с полем CategoryID , используемым в качестве значения.

Отображение поля CategoryName и идентификатора категории, используемого в качестве значения

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

После внесения этих изменений декларативная разметка EditItemTemplate для в CategoryName TemplateField будет включать как DropDownList, так и ObjectDataSource:

<asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
    <EditItemTemplate>
        <asp:DropDownList ID="Categories" runat="server"
          DataSourceID="CategoriesDataSource"
          DataTextField="CategoryName" DataValueField="CategoryID">
        </asp:DropDownList>
        <asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
            OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetCategories" TypeName="CategoriesBLL">
        </asp:ObjectDataSource>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server"
          Text='<%# Bind("CategoryName") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Примечание

В раскрывающемся списке в EditItemTemplate должно быть включено состояние представления. Вскоре мы добавим синтаксис привязки данных в декларативный синтаксис DropDownList и команды привязки данных, такие как Eval() и Bind() могут отображаться только в элементах управления, состояние представления которых включено.

Повторите эти действия, чтобы добавить DropDownList с именем Suppliers в SupplierName templateField EditItemTemplate. Это будет включать добавление DropDownList в EditItemTemplate и создание другого ObjectDataSource. Однако Suppliers объект ObjectDataSource dropDownList должен быть настроен для вызова SuppliersBLL метода класса GetSuppliers() . Кроме того, настройте Suppliers Раскрывающийся список для отображения CompanyName поля и используйте SupplierID поле в качестве значения для его ListItem значений.

После добавления DropDownLists к двум EditItemTemplate файлам загрузите страницу в браузере и нажмите кнопку Изменить для продукта Chef Антона Cajun Seasoning. Как показано на рисунке 9, столбцы категории продукта и поставщика отображаются в виде раскрывающихся списков, содержащих доступные категории и поставщики на выбор. Тем не менее, обратите внимание, что первые элементы в обоих раскрывающихся списках выбраны по умолчанию (напитки для категории и экзотические жидкости в качестве поставщика), даже несмотря на то, что шеф-повар Антон Cajun Приправа является приправой, поставляемой New Orleans Cajun Delights.

Первый элемент в Drop-Down Списки выбран по умолчанию

Рис. 9. Первый элемент в Drop-Down Списки выбран по умолчанию (щелкните для просмотра полноразмерного изображения)

Кроме того, если нажать кнопку Обновить, вы увидите, что для продукта CategoryID и SupplierID задано значение NULL. Оба этих нежелательных поведения вызваны тем, что DropDownLists в EditItemTemplate не привязаны ни к каким полям данных из базовых данных продукта.

Привязка раскрывающихся списков к полямCategoryIDданных иSupplierID

Чтобы в раскрывающихся списках измененных продуктов и поставщиков были заданы соответствующие значения и чтобы эти значения были отправлены обратно в метод BLL UpdateProduct при нажатии кнопки Обновить, необходимо привязать свойства DropDownLists SelectedValue к CategoryID полям данных и SupplierID с помощью двусторонней привязки данных. Для этого с помощью Categories DropDownList можно добавить SelectedValue='<%# Bind("CategoryID") %>' непосредственно в декларативный синтаксис.

Кроме того, можно задать привязки данных DropDownList, изменив шаблон с помощью Designer и щелкнув ссылку Изменить dataBindings из смарт-тега DropDownList. Затем укажите, что SelectedValue свойство должно быть привязано к полю CategoryID с помощью двусторонней привязки данных (см. рис. 10). Повторите декларативный или Designer процесс, чтобы привязать SupplierID поле данных к Suppliers DropDownList.

Привязка CategoryID к свойству SelectedValue dropDownList с помощью Two-Way привязки данных

Рис. 10. Привязка CategoryID к свойству DropDownList SelectedValue с помощью Two-Way привязки данных (щелкните для просмотра полноразмерного изображения)

После применения привязок к свойствам SelectedValue двух DropDownLists в столбцах категории и поставщика измененного продукта по умолчанию будут использоваться значения текущего продукта. После нажатия кнопки Обновить CategoryID значения и SupplierID выбранного элемента раскрывающегося списка будут переданы методу UpdateProduct . На рисунке 11 показано руководство после добавления операторов привязки данных. Обратите внимание, что выбранные элементы раскрывающегося списка для приправы шеф-повара Антона Каджун правильно приправы и Нового Орлеана Cajun Delights.

Текущая категория и значения поставщика измененного продукта выбраны по умолчанию

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

ОбработкаNULLзначений

Столбцы CategoryID и SupplierID в Products таблице могут быть NULL, но dropDownLists в EditItemTemplate не включают элемент списка для представления NULL значения. Это имеет два последствия:

  • Пользователь не может использовать наш интерфейс для изменения категории продукта или поставщика с не-значенияNULL на категорию NULL продукта
  • Если в продукте NULLCategoryID есть или SupplierID, нажатие кнопки Изменить приведет к исключению. Это связано с тем, что NULL значение, возвращаемое CategoryID в операторе (или SupplierID), Bind() не сопоставляется со значением в DropDownList (DropDownList создает исключение, если его SelectedValue свойству присвоено значение, не вложенное в коллекцию элементов списка).

Для поддержки NULLCategoryID значений и SupplierID необходимо добавить еще один ListItem элемент в каждый DropDownList для представления NULL значения. В учебнике Фильтрация основных и подробных данных с помощью DropDownList мы узнали, как добавить дополнительный ListItem элемент в список dropDownList для исходящего трафика, который включал задание свойства True DropDownList AppendDataBoundItems в значение и добавление дополнительного ListItemвручную . Однако в этом предыдущем руководстве мы добавили ListItem с Value .-1 Однако логика привязки данных в ASP.NET автоматически преобразует пустую строку в NULL значение и наоборот. Поэтому для работы с этим руководством мы хотим ListItem, чтобы символы были Value пустой строкой.

Для начала задав для обоих свойств DropDownLists AppendDataBoundItems значение True. Затем добавьте , NULLListItem добавив следующий <asp:ListItem> элемент в каждый DropDownList, чтобы декларативная разметка выглядела следующим образом:

<asp:DropDownList ID="Categories" runat="server"
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'
    AppendDataBoundItems="True">
    <asp:ListItem Value="">(None)</asp:ListItem>
</asp:DropDownList>

Я решил использовать значение "(None)" в качестве текстового значения для этого ListItem, но при желании вы можете изменить его на пустую строку.

Примечание

Как мы видели в учебнике Фильтрация основных и подробных данных с помощью DropDownList, ListItem объекты можно добавить в DropDownList с помощью Designer, щелкнув свойство DropDownList Items в окно свойств (который отобразит ListItem Редактор Коллекции). Однако обязательно добавьте NULLListItem для этого руководства с помощью декларативного синтаксиса. Если вы используете ListItem Редактор Коллекции, созданный декларативный синтаксис будет полностью пропускать Value параметр при назначении пустой строки, создавая декларативную разметку, например: <asp:ListItem>(None)</asp:ListItem>. Хотя это может выглядеть безобидно, отсутствующее значение приводит к тому, что DropDownList будет использовать Text значение свойства вместо нее. Это означает, что если этот NULLListItem параметр выбран, будет предпринята попытка присвоить значение "(None)" , что приведет к CategoryIDисключению. При явном задании Value=""NULL значение будет присваиваться CategoryID при выборе NULLListItem .

Повторите эти действия для раскрывающегося списка поставщиков.

С помощью этого дополнительного ListItemинтерфейса редактирования теперь можно назначать NULL значения полям Product CategoryID и SupplierID , как показано на рис. 12.

Выберите (Нет), чтобы назначить значение NULL для категории или поставщика продукта

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

Шаг 4. Использование radioButtons для состояния "Прекращено"

В настоящее время поле данных продуктов Discontinued выражается с помощью CheckBoxField, который отображает отключенный флажок для строк, доступных только для чтения, и включенный флажок для редактируемой строки. Хотя этот пользовательский интерфейс часто подходит, при необходимости его можно настроить с помощью TemplateField. В этом руководстве давайте изменим CheckBoxField на TemplateField, использующий элемент управления RadioButtonList с двумя параметрами "Активный" и "Прекращено", из которых пользователь может указать значение продукта Discontinued .

Начните с преобразования Discontinued CheckBoxField в TemplateField, который создаст TemplateField с ItemTemplate и EditItemTemplate. Оба шаблона включают CheckBox со свойством Checked , привязанным к полю Discontinued данных. Единственное различие между ними заключается в том, что свойству ItemTemplateCheckBox Enabled присвоено значение False.

Замените CheckBox в ItemTemplate и EditItemTemplate элементом управления RadioButtonList, присвоив свойствам RadioButtonLists ID значение DiscontinuedChoice. Затем укажите, что каждый элемент RadioButtonLists должен содержать два переключателя: один с меткой "Активный" со значением "False", а другой с меткой "Не поддерживается" со значением "True". Для этого можно либо ввести <asp:ListItem> элементы напрямую с помощью декларативного синтаксиса, либо использовать ListItem Редактор Collection из Designer. На рисунке 13 показана ListItem Редактор Коллекции после указания двух параметров переключателя.

Добавление активных и неподдерживаемых параметров в RadioButtonList

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

Так как Элемент RadioButtonList в ItemTemplate не должен быть редактируемым, задайте для его Enabled свойства Falseзначение , оставив Enabled для свойства True значение (по умолчанию) для RadioButtonList в EditItemTemplate. Это сделает переключатели в нередактируемой строке только для чтения, но позволит пользователю изменять значения RadioButton для измененной строки.

Нам по-прежнему нужно назначить свойства элементов управления SelectedValue RadioButtonList, чтобы соответствующий переключатель был выбран на основе поля данных продукта Discontinued . Как и в случае с DropDownLists, рассмотренным ранее в этом руководстве, этот синтаксис привязки данных можно добавить непосредственно в декларативную разметку или через ссылку Edit DataBindings в смарт-тегах RadioButtonLists.

После добавления двух элементов RadioButtonLists и их Discontinued настройки декларативная разметка TemplateField должна выглядеть следующим образом:

<asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
    <ItemTemplate>
        <asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
          Enabled="False" SelectedValue='<%# Bind("Discontinued") %>'>
            <asp:ListItem Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Discontinued</asp:ListItem>
        </asp:RadioButtonList>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:RadioButtonList ID="DiscontinuedChoice" runat="server"
            SelectedValue='<%# Bind("Discontinued") %>'>
            <asp:ListItem Value="False">Active</asp:ListItem>
            <asp:ListItem Value="True">Discontinued</asp:ListItem>
        </asp:RadioButtonList>
    </EditItemTemplate>
</asp:TemplateField>

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

Неподдерживаемые флажки заменены парами переключателей

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

Примечание

Discontinued Так как столбец в Products базе данных не может иметь NULL значения, нам не нужно беспокоиться о сборе NULL информации в интерфейсе . Однако если столбец может содержать NULL значения, Discontinued мы хотели бы добавить в список третий переключатель, для которого Value задана пустая строка (Value=""), как и в случае с категорией и dropDownLists поставщика.

Сводка

Хотя boundField и CheckBoxField автоматически отрисовывают интерфейсы только для чтения, редактирования и вставки, они не имеют возможности настройки. Однако часто нам нужно настроить интерфейс редактирования или вставки, например добавить элементы управления проверкой (как мы видели в предыдущем руководстве) или путем настройки пользовательского интерфейса сбора данных (как мы видели в этом руководстве). Настройка интерфейса с помощью TemplateField может быть обобщена в следующих шагах:

  1. Добавление TemplateField или преобразование существующего BoundField или CheckBoxField в TemplateField
  2. При необходимости расширять интерфейс
  3. Привязка соответствующих полей данных к добавленным веб-элементам управления с помощью двусторонней привязки данных

Помимо использования встроенных ASP.NET веб-элементов управления, можно также настроить шаблоны TemplateField с помощью пользовательских, скомпилированных серверных элементов управления и пользовательских элементов управления.

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

Об авторе

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