Фильтрация "Основной/подробности" с помощью двух элементов управления DropDownList (C#)Master/Detail Filtering With Two DropDownLists (C#)

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

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

Это руководство расширяет отношение "основной/подробности", добавляя третий слой, используя два элемента управления DropDownList для выбора нужных записей родителей и бабушкх.This tutorial expands the master/detail relationship to add a third layer, using two DropDownList controls to select the desired parent and grandparent records.

ВведениеIntroduction

В предыдущем учебном курсе мы рассмотрели, как отобразить простой отчет «основной/подробности» с помощью одного элемента управления DropDownList, заполненного категориями, и элементом управления GridView, отображающим продукты, принадлежащие выбранной категории.In the previous tutorial we examined how to display a simple master/details report using a single DropDownList populated with the categories and a GridView showing those products that belong to the selected category. Этот шаблон отчета хорошо работает при отображении записей с отношением "один ко многим" и может быть легко расширено для работы в сценариях, включающих несколько связей "один ко многим".This report pattern works well when displaying records that have a one-to-many relationship and can easily be extended to work for scenarios that include multiple one-to-many relationships. Например, система ввода заказов будет иметь таблицы, соответствующие клиентам, заказам и позициям строк заказа.For example, an order entry system would have tables that correspond to customers, orders, and order line items. У данного клиента может быть несколько заказов с каждым заказом, состоящим из нескольких элементов.A given customer may have multiple orders with each order consisting of multiple items. Такие данные могут быть представлены пользователю с двумя элементов управления DropDownList и GridView.Such data can be presented to the user with two DropDownLists and a GridView. Первый DropDownList будет иметь элемент списка для каждого клиента в базе данных со вторым содержимым заказами, размещенными выбранным клиентом.The first DropDownList would have a list item for each customer in the database with the second one's contents being the orders placed by the selected customer. Элемент управления GridView будет перечислять элементы строк из выбранного заказа.A GridView would list the line items from the selected order.

Хотя база данных Northwind включает в себя каноническую информацию о клиенте/заказе или заказе в своих Customers, Ordersи Order Details таблицах, эти таблицы не фиксируются в нашей архитектуре.While the Northwind database include the canonical customer/order/order details information in its Customers, Orders, and Order Details tables, these tables aren't captured in our architecture. Тем не менее, мы можем проиллюстрировать использование двух зависимых элементов управления DropDownList.Nonetheless, we can still illustrate using two dependent DropDownLists. В первом списке DropDownList будут перечислены категории и вторая продукция, относящаяся к выбранной категории.The first DropDownList will list the categories and the second the products belonging to the selected category. Затем DetailsView будет выводить сведения о выбранном продукте.A DetailsView will then list the details of the selected product.

Шаг 1. Создание и заполнение элемента DropDownList в категорияхStep 1: Creating and Populating the Categories DropDownList

Первая цель — добавить DropDownList, в котором перечислены категории.Our first goal is to add the DropDownList that lists the categories. Эти действия были подробно рассмотрены в предыдущем руководстве, но здесь приведены сводные сведения о полноте.These steps were examined in detail in the preceding tutorial, but are summarized here for completeness.

Откройте страницу MasterDetailsDetails.aspx в папке Filtering, добавьте DropDownList на страницу, задайте для свойства ID значение Categories, а затем щелкните ссылку Настроить источник данных в своем смарт-теге.Open the MasterDetailsDetails.aspx page in the Filtering folder, add a DropDownList to the page, set its ID property to Categories, and then click the Configure Data Source link in its smart tag. В мастере настройки источника данных выберите Добавление нового источника данных.From the Data Source Configuration Wizard choose to add a new data source.

добавить новый источник данных для DropDownListAdd a New Data Source for the DropDownList

Рис. 1. Добавление нового источника данных для DropDownList (щелкните, чтобы просмотреть изображение с полным размером)Figure 1: Add a New Data Source for the DropDownList (Click to view full-size image)

Новый источник данных должен, естественно, быть ObjectDataSource.The new data source should, naturally, be an ObjectDataSource. Назовите этот новый элемент ObjectDataSource CategoriesDataSource и вызовите метод GetCategories() объекта CategoriesBLL.Name this new ObjectDataSource CategoriesDataSource and have it invoke the CategoriesBLL object's GetCategories() method.

выбрать использование класса CategoriesBLLChoose to Use the CategoriesBLL Class

Рис. 2. Выбор использования класса CategoriesBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 2: Choose to Use the CategoriesBLL Class (Click to view full-size image)

настроить ObjectDataSource для использования метода-Categories ()Configure the ObjectDataSource to Use the GetCategories() Method

Рис. 3. Настройка ObjectDataSource для использования метода GetCategories() (щелкните, чтобы просмотреть изображение с полным размером)Figure 3: Configure the ObjectDataSource to Use the GetCategories() Method (Click to view full-size image)

После настройки ObjectDataSource необходимо указать, какое поле источника данных должно отображаться в элементе управления DropDownList Categories и какое значение должно быть настроено в качестве значения для элемента списка.After configuring the ObjectDataSource we still need to specify which data source field should be displayed in the Categories DropDownList and which one should be configured as the value for the list item. Задайте поле CategoryName как отображаемое и CategoryID в качестве значения для каждого элемента списка.Set the CategoryName field as the display and CategoryID as the value for each list item.

отображать поле CategoryName и использовать CategoryID в качестве значенияHave the DropDownList Display the CategoryName Field and Use CategoryID as the Value

Рис. 4. отображение поля CategoryName в DropDownList и использование CategoryID в качестве значения (щелкните, чтобы просмотреть изображение с полным размером)Figure 4: Have the DropDownList Display the CategoryName Field and Use CategoryID as the Value (Click to view full-size image)

На этом этапе у нас есть элемент управления DropDownList (Categories), который заполняется записями из Categories таблицы.At this point we have a DropDownList control (Categories) that's populated with the records from the Categories table. Когда пользователь выбирает новую категорию из DropDownList, необходимо выполнить обратную передачу, чтобы обновить DropDownList продукта, который мы создадим на шаге 2.When the user chooses a new category from the DropDownList we'll want a postback to occur in order to refresh the product DropDownList that we're going to create in Step 2. Поэтому установите флажок Включить автообратную передачу из смарт-тега categories DropDownList.Therefore, check the Enable AutoPostBack option from the categories DropDownList's smart tag.

включить автообратную передачу для DropDownList категорийEnable AutoPostBack for the Categories DropDownList

Рис. 5. Включение автообратной передачи для Categories DropDownList (щелкните, чтобы просмотреть изображение с полным размером)Figure 5: Enable AutoPostBack for the Categories DropDownList (Click to view full-size image)

Шаг 2. Отображение продуктов выбранной категории во втором элементе DropDownListStep 2: Displaying the Selected Category's Products in a Second DropDownList

После завершения работы с DropDownList Categories наш следующий шаг — отображение элемента DropDownList для продуктов, принадлежащих выбранной категории.With the Categories DropDownList completed, our next step is to display a DropDownList of products belonging to the selected category. Для этого добавьте в страницу другое окно DropDownList с именем ProductsByCategory.To accomplish this, add another DropDownList to the page named ProductsByCategory. Как и в Categories DropDownList, создайте новый элемент ObjectDataSource для ProductsByCategory DropDownList с именем ProductsByCategoryDataSource.As with the Categories DropDownList, create a new ObjectDataSource for the ProductsByCategory DropDownList named ProductsByCategoryDataSource.

добавить новый источник данных для DropDownList ProductsByCategoryAdd a New Data Source for the ProductsByCategory DropDownList

Рис. 6. Добавление нового источника данных для элемента DropDownList ProductsByCategory (щелкните, чтобы просмотреть изображение с полным размером)Figure 6: Add a New Data Source for the ProductsByCategory DropDownList (Click to view full-size image)

создать новый элемент управления ObjectDataSource с именем ПродуктсбикатегоридатасаурцеCreate a New ObjectDataSource Named ProductsByCategoryDataSource

Рис. 7. Создание нового элемента управления ObjectDataSource с именем ProductsByCategoryDataSource (щелкните, чтобы просмотреть изображение с полным размером)Figure 7: Create a New ObjectDataSource Named ProductsByCategoryDataSource (Click to view full-size image)

Поскольку ProductsByCategory DropDownList должны отображать только те продукты, которые относятся к выбранной категории, элемент ObjectDataSource должен вызвать метод GetProductsByCategoryID(categoryID) из объекта ProductsBLL.Since the ProductsByCategory DropDownList needs to display just those products belonging to the selected category, have the ObjectDataSource invoke the GetProductsByCategoryID(categoryID) method from the ProductsBLL object.

выбрать использование класса ProductsBLLChoose to Use the ProductsBLL Class

Рис. 8. Выбор использования класса ProductsBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 8: Choose to Use the ProductsBLL Class (Click to view full-size image)

настроить ObjectDataSource для использования метода GetProductsByCategoryID (categoryID)Configure the ObjectDataSource to Use the GetProductsByCategoryID(categoryID) Method

Рис. 9. Настройка ObjectDataSource для использования метода GetProductsByCategoryID(categoryID) (щелкните, чтобы просмотреть изображение с полным размером)Figure 9: Configure the ObjectDataSource to Use the GetProductsByCategoryID(categoryID) Method (Click to view full-size image)

На последнем шаге мастера необходимо указать значение параметра categoryID .In the final step of the wizard we need to specify the value of the categoryID parameter. Присвойте этот параметр выбранному элементу из Categories DropDownList.Assign this parameter to the selected item from the Categories DropDownList.

извлечь значение параметра categoryID из DropDownList категорийPull the categoryID Parameter Value from the Categories DropDownList

Рис. 10. извлечение значения categoryID параметра из Categories DropDownList (щелкните, чтобы просмотреть изображение с полным размером)Figure 10: Pull the categoryID Parameter Value from the Categories DropDownList (Click to view full-size image)

После настройки ObjectDataSource остается только указать поля источника данных, используемые для вывода и значения элементов DropDownList.With the ObjectDataSource configured, all that remains is to specify what data source fields are used for the display and value of the DropDownList's items. Отобразите поле ProductName и используйте в качестве значения поле ProductID.Display the ProductName field and use the ProductID field as the value.

указать поля источника данных, используемые для свойств Text и Value элемента списка DropDownListSpecify the Data Source Fields Used for the DropDownList's ListItems' Text and Value Properties

Рис. 11. Указание полей источника данных, используемых для свойств ListItem s "Text и Value элемента DropDownList (щелкните, чтобы просмотреть изображение с полным размером)Figure 11: Specify the Data Source Fields Used for the DropDownList's ListItem s' Text and Value Properties (Click to view full-size image)

С помощью элемента управления DropDownList и ProductsByCategory, настроенного на нашей странице, будут отображены два элементов управления DropDownList: Первая выводит все категории, а вторая — список продуктов, принадлежащих выбранной категории.With the ObjectDataSource and ProductsByCategory DropDownList configured our page will display two DropDownLists: the first will list all of the categories while the second will list those products belonging to the selected category. Когда пользователь выбирает новую категорию из первого элемента DropDownList, будет предприниматься обратная передача, а второй элемент DropDownList будет привязан повторно, отображая продукты, принадлежащие к только что выбранной категории.When the user selects a new category from the first DropDownList, a postback will ensue and the second DropDownList will be rebound, showing those products that belong to the newly selected category. На рисунках 12 и 13 показаны MasterDetailsDetails.aspx в действии при просмотре в браузере.Figures 12 and 13 show MasterDetailsDetails.aspx in action when viewed through a browser.

при первом посещении страницы выбирается Категория «напитки»When First Visiting the Page, the Beverages Category is Selected

Рис. 12. при первом посещении страницы выбирается Категория «напитки» (щелкните, чтобы просмотреть изображение с полным размером).Figure 12: When First Visiting the Page, the Beverages Category is Selected (Click to view full-size image)

выборе другой категории отображаются продукты новой категории.Choosing a Different Category Displays the New Category's Products

Рис. 13. Выбор другой категории отображает продукты новой категории (щелкните, чтобы просмотреть изображение с полным размером)Figure 13: Choosing a Different Category Displays the New Category's Products (Click to view full-size image)

В настоящее время productsByCategory DropDownList, при изменении, не вызывает обратную передачу.Currently the productsByCategory DropDownList, when changed, does not cause a postback. Однако мы хотим, чтобы обратная передача выполнялась после добавления элемента DetailsView для вывода сведений о выбранном продукте (шаг 3).However, we will want a postback to occur once we add a DetailsView to display the selected product's details (Step 3). Поэтому установите флажок Включить автообратную передачу из смарт-тега productsByCategory DropDownList.Therefore, check the Enable AutoPostBack checkbox from the productsByCategory DropDownList's smart tag.

включить функцию автообратной передачи для DropDownList productsByCategoryEnable the AutoPostBack Feature for the productsByCategory DropDownList

Рис. 14. Включение функции автообратной передачи для элемента DropDownList productsByCategory (щелкните, чтобы просмотреть изображение с полным размером)Figure 14: Enable the AutoPostBack Feature for the productsByCategory DropDownList (Click to view full-size image)

Шаг 3. Отображение сведений о выбранном продукте с помощью элемента DetailsViewStep 3: Using a DetailsView to Display Details for the Selected Product

Последним шагом является отображение сведений о выбранном продукте в элементе DetailsView.The final step is to display the details for the selected product in a DetailsView. Для этого добавьте DetailsView на страницу, задайте для свойства ID значение ProductDetailsи создайте для него новый элемент управления ObjectDataSource.To accomplish this, add a DetailsView to the page, set its ID property to ProductDetails, and create a new ObjectDataSource for it. Настройте этот элемент ObjectDataSource, чтобы извлечь данные из метода GetProductByProductID(productID) класса ProductsBLL, используя выбранное значение ProductsByCategory DropDownList для значения параметра productID .Configure this ObjectDataSource to pull its data from the ProductsBLL class's GetProductByProductID(productID) method using the selected value of the ProductsByCategory DropDownList for the value of the productID parameter.

выбрать использование класса ProductsBLLChoose to Use the ProductsBLL Class

Рис. 15. Выбор использования класса ProductsBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 15: Choose to Use the ProductsBLL Class (Click to view full-size image)

настроить ObjectDataSource для использования метода Жетпродуктбипродуктид (productID)Configure the ObjectDataSource to Use the GetProductByProductID(productID) Method

Рис. 16. Настройка ObjectDataSource для использования метода GetProductByProductID(productID) (щелкните, чтобы просмотреть изображение с полным размером)Figure 16: Configure the ObjectDataSource to Use the GetProductByProductID(productID) Method (Click to view full-size image)

извлечь значение параметра productID из DropDownList ProductsByCategoryPull the productID Parameter Value from the ProductsByCategory DropDownList

Рис. 17. извлечение значения productID параметра из ProductsByCategory DropDownList (щелкните, чтобы просмотреть изображение с полным размером)Figure 17: Pull the productID Parameter Value from the ProductsByCategory DropDownList (Click to view full-size image)

Можно выбрать отображение любого из доступных полей в элементе DetailsView.You can choose to display any of the available fields in the DetailsView. Я решил удалить поля ProductID, SupplierIDи CategoryID, а также изменить порядок и отформатировать оставшиеся поля.I've opted to remove the ProductID, SupplierID, and CategoryID fields and reordered and formatted the remaining fields. Кроме того, я очистил свойства Height и Width DetailsView, позволяя элементу DetailsView расшириться до ширины, необходимой для наилучшего представления данных, а не ограничиваться заданным размером.In addition, I cleared out the DetailsView's Height and Width properties, allowing the DetailsView to expand to the width needed to best display its data rather than having it constrained to a specified size. Полная разметка показана ниже:The full markup appears below:

<asp:DetailsView ID="ProductDetails" runat="server"
    AutoGenerateRows="False" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" EnableViewState="False">
    <Fields>
        <asp:BoundField DataField="ProductName"
          HeaderText="Product" SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName"
          HeaderText="Category" ReadOnly="True"
          SortExpression="CategoryName" />
        <asp:BoundField DataField="SupplierName"
          HeaderText="Supplier" ReadOnly="True"
          SortExpression="SupplierName" />
        <asp:BoundField DataField="QuantityPerUnit"
          HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" />
        <asp:BoundField DataField="UnitPrice"
          DataFormatString="{0:c}" HeaderText="Price"
          HtmlEncode="False" SortExpression="UnitPrice" />
        <asp:BoundField DataField="UnitsInStock"
          HeaderText="UnitsInStock" SortExpression="Units In Stock" />
        <asp:BoundField DataField="UnitsOnOrder"
          HeaderText="UnitsOnOrder" SortExpression="Units On Order" />
        <asp:BoundField DataField="ReorderLevel"
          HeaderText="ReorderLevel" SortExpression="Reorder Level" />
        <asp:CheckBoxField DataField="Discontinued"
          HeaderText="Discontinued" SortExpression="Discontinued" />
    </Fields>
</asp:DetailsView>

Уделите немного времени, чтобы испытать страницу MasterDetailsDetails.aspx в браузере.Take a moment to try out the MasterDetailsDetails.aspx page in a browser. На первый взгляд может показаться, что все работает надлежащим образом, но есть несложная проблема.At first glance it may appear that everything is working as desired, but there's a subtle problem. При выборе новой категории ProductsByCategory DropDownList обновляется, чтобы включить эти продукты для выбранной категории, но ProductDetails DetailsView продолжает отображать предыдущую информацию о продукте.When you choose a new category the ProductsByCategory DropDownList is updated to include those products for the selected category, but the ProductDetails DetailsView continued to show the previous product information. Элемент DetailsView обновляется при выборе другого продукта для выбранной категории.The DetailsView is updated when choosing a different product for the selected category. Более того, при тщательном тестировании вы обнаружите, что если постоянно выбрать новые категории (например, выбрать напитки из Categories DropDownList, затем «специи», а затем Конфектионс), то при каждом выборе категории DetailsView будет обновлено ProductDetails.Furthermore, if you test thoroughly enough, you'll find that if you continually choose new categories (such as choosing Beverages from the Categories DropDownList, then Condiments, then Confections) every other category selection causes the ProductDetails DetailsView to be refreshed.

Чтобы помочь конкретизировать эту проблему, давайте взглянем на конкретный пример.To help concretize this problem, let's look at a specific example. При первом посещении страницы выбирается Категория «напитки», а связанные продукты загружаются в ProductsByCategory DropDownList.When you first visit the page the Beverages category is selected and the related products are loaded in the ProductsByCategory DropDownList. Chai — это выбранный продукт, и его сведения отображаются в ProductDetails DetailsView, как показано на рис. 18.Chai is the selected product and its details are displayed in the ProductDetails DetailsView, as shown in Figure 18.

сведения о выбранном продукте отображаются в элементе DetailsViewThe Selected Product's Details are Displayed in a DetailsView

Рис. 18. сведения о выбранном продукте отображаются в элементе DetailsView (щелкните, чтобы просмотреть изображение с полным размером)Figure 18: The Selected Product's Details are Displayed in a DetailsView (Click to view full-size image)

Если вы изменяете выбор категории с "Напиткиs" на «специи», происходит обратная передача, и ProductsByCategory DropDownList обновляется соответствующим образом, но элемент DetailsView по-прежнему отображает сведения для Chai.If you change the category selection from Beverages to Condiments, a postback occurs and the ProductsByCategory DropDownList is updated accordingly, but the DetailsView still displays details for Chai.

сведения о выбранном ранее продукте по-прежнему отображаютсяThe Previously Selected Product's Details are Still Displayed

Рис. 19. сведения о выбранном ранее продукте по-прежнему отображаются (щелкните, чтобы просмотреть изображение с полным размером)Figure 19: The Previously Selected Product's Details are Still Displayed (Click to view full-size image)

При выборе нового продукта из списка элемент DetailsView обновляется, как и ожидалось.Picking a new product from the list refreshes the DetailsView as expected. Если после изменения продукта выбрать новую категорию, то DetailsView снова не обновится.If you pick a new category after changing the product, the DetailsView again won't refresh. Однако если вместо выбора нового продукта выбрана новая категория, элемент DetailsView обновится.However, if instead of choosing a new product you selected a new category, the DetailsView would refresh. Что происходит в мире?What in the world is going on here?

Проблема — это проблема времени в жизненном цикле страницы.The problem is a timing issue in the page's lifecycle. Каждый раз, когда запрашивается страница, она проходит ряд шагов в качестве ее отрисовки.Whenever a page is requested it proceeds through a number of steps as its rendering. В одном из этих действий элементы управления ObjectDataSource проверяют, изменились ли какие либо их SelectParameters значения.In one of these steps the ObjectDataSource controls check to see if any of their SelectParameters values have changed. Если да, то веб-элемент управления данными, привязанный к ObjectDataSource, знает, что ему нужно обновить его отображение.If so, the data Web control bound to the ObjectDataSource knows that it needs to refresh its display. Например, если выбрана новая категория, ProductsByCategoryDataSource ObjectDataSource обнаруживает, что значения ее параметров изменились и ProductsByCategory DropDownList выполняет повторную привязку, получая продукты для выбранной категории.For example, when a new category is selected, the ProductsByCategoryDataSource ObjectDataSource detects that its parameter values have changed and the ProductsByCategory DropDownList rebinds itself, getting the products for the selected category.

Проблема, которая возникает в этой ситуации, заключается в том, что точка жизненного цикла страницы, которая проверяется на предмет измененных параметров, выполняется перед повторной привязкой связанных веб-элементов управления данными.The problem that arises in this situation is that the point in the page lifecycle that the ObjectDataSources check for changed parameters occurs before the rebinding of the associated data Web controls. Поэтому при выборе новой категории ProductsByCategoryDataSource ObjectDataSource обнаруживает изменение значения его параметра.Therefore, when selecting a new category the ProductsByCategoryDataSource ObjectDataSource detects a change in its parameter's value. Тем не менее, ObjectDataSource, используемый ProductDetails DetailsView, не запомните никаких изменений, так как ProductsByCategory DropDownList еще не был привязан.The ObjectDataSource used by the ProductDetails DetailsView, however, doesn't note any such changes because the ProductsByCategory DropDownList has yet to be rebound. Позднее в жизненном цикле ProductsByCategory DropDownList повторно привязывается к элементу ObjectDataSource, заменяя продукты для вновь выбранной категории.Later in the lifecycle the ProductsByCategory DropDownList rebinds to its ObjectDataSource, grabbing the products for the newly selected category. Хотя значение DropDownList ProductsByCategory изменилось, элемент управления ObjectDataSource ProductDetails DetailsView уже выполнил проверку значения параметра; Таким образом, элемент DetailsView отображает свои предыдущие результаты.While the ProductsByCategory DropDownList's value has changed, the ProductDetails DetailsView's ObjectDataSource has already done its parameter value check; therefore, the DetailsView displays its previous results. Это взаимодействие показано на рис. 20.This interaction is depicted in Figure 20.

значение ProductsByCategory DropDownList изменяется после того, как ObjectDataSource Продуктдетаилс DetailsView проверяет наличие измененийThe ProductsByCategory DropDownList Value Changes After the ProductDetails DetailsView's ObjectDataSource Checks for Changes

Рис. 20. значение ProductsByCategory DropDownList изменяется после того, как элемент управления ObjectDataSource ProductDetails DetailsView проверяет наличие изменений (щелкните, чтобы просмотреть изображение с полным размером)Figure 20: The ProductsByCategory DropDownList Value Changes After the ProductDetails DetailsView's ObjectDataSource Checks for Changes (Click to view full-size image)

Для устранения этой проблемы необходимо явно выполнить привязку ProductDetails DetailsView после привязки ProductsByCategory DropDownList.To remedy this we need to explicitly rebind the ProductDetails DetailsView after the ProductsByCategory DropDownList has been bound. Это можно сделать, вызвав метод DataBind() ProductDetails DetailsView, когда срабатывает событие DataBound ProductsByCategory DropDownList.We can accomplish this by calling the ProductDetails DetailsView's DataBind() method when the ProductsByCategory DropDownList's DataBound event fires. Добавьте следующий код обработчика событий в класс кода программной части MasterDetailsDetails.aspx страницы (см. "программное задание значений параметров ObjectDataSource" для обсуждения добавления обработчика событий):Add the following event handler code to the MasterDetailsDetails.aspx page's code-behind class (refer to the "Programmatically Setting the ObjectDataSource's Parameter Values" for a discussion on how to add an event handler):

protected void ProductsByCategory_DataBound(object sender, EventArgs e)
{
    ProductDetails.DataBind();
}

После того как был добавлен явный вызов метода DataBind() ProductDetails DetailsView, учебник работает правильно.After this explicit call to the ProductDetails DetailsView's DataBind() method has been added, the tutorial works as expected. На рис. 21 показано, как это изменение исправлено в нашей предыдущей проблеме.Figure 21 highlights how this changed remedied our earlier problem.

Продуктдетаилс DetailsView явно обновляется при срабатывании события привязки к данным DropDownList ProductsByCategoryThe ProductDetails DetailsView is Explicitly Refreshed When the ProductsByCategory DropDownList's DataBound Event Fires

Рисунок 21. ProductDetails DetailsView явно обновляется при срабатывании события DataBound ProductsByCategory DropDownList (щелкните, чтобы просмотреть изображение с полным размером).Figure 21: The ProductDetails DetailsView is Explicitly Refreshed When the ProductsByCategory DropDownList's DataBound Event Fires (Click to view full-size image)

СводкаSummary

Элемент DropDownList выступает в качестве идеального элемента пользовательского интерфейса для отчетов «основной/подробности», где существует связь «один ко многим» между главной и подробной записями.The DropDownList serves as an ideal user interface element for master/detail reports where there is a one-to-many relationship between the master and detail records. В предыдущем учебном курсе мы увидели, как использовать одно DropDownList для фильтрации продуктов, отображаемых выбранной категорией.In the preceding tutorial we saw how to use a single DropDownList to filter the products displayed by the selected category. В этом руководстве мы заменили элемент управления GridView для продуктов элементом управления DropDownList и используем DetailsView для просмотра сведений о выбранном продукте.In this tutorial we replaced the GridView of products with a DropDownList, and used a DetailsView to display the details of the selected product. Концепции, обсуждаемые в этом руководстве, можно легко расширить на модели данных, включающие в себя несколько связей «один ко многим», таких как клиенты, заказы и элементы заказов.The concepts discussed in this tutorial can easily be extended to data models involving multiple one-to-many relationships, such as customers, orders, and order items. В целом, всегда можно добавить элемент DropDownList для каждой из сущностей «один» в связях «один ко многим».In general, you can always add a DropDownList for each of the "one" entities in the one-to-many relationships.

Поздравляем с программированием!Happy Programming!

Об автореAbout the Author

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Скотт работает как независимый консультант, преподаватель и модуль записи.Scott works as an independent consultant, trainer, and writer. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Он доступен по адресу mitchell@4GuysFromRolla.com.He can be reached at mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.or via his blog, which can be found at http://ScottOnWriting.NET.

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

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