Пошаговое руководство. Фильтрация строк в таблицах, содержащих отношения "родитель-потомок"

В этом пошаговом руководстве демонстрируется фильтрация строк в таблицах, содержащих отношения "родитель-потомок". Фильтрация строк таблиц позволяет пользователю выбирать (отфильтровывать) отображаемые строки таблицы в зависимости от значений в выбранном столбце. Это также позволяет определить столбцы для вывода и порядок, в котором они отображаются.

В примерах этого раздела используются таблицы базы данных AdventureWorks. Дочерняя таблица Product содержит столбец внешних ключей ProductCategory, определяемый в родительской таблице ProductCategories. Таблицы содержат отношения "один ко многим", т. ел. одна категория может быть связаны с несколькими продуктами.

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

В данном пошаговом руководстве рассмотрены следующие задачи:

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

  • Настройка дочерней таблицы для отображения отфильтрованных строк. Настройка предполагает задание параметра элементу управления LinqDataSource для доступа к базе данных, содержащей дочернюю таблицу. Кроме того задается элемент управления GridView для отображения отфильтрованных строк дочерней таблицы.

  • Настройка фильтрации строк дочерней таблицы. Элемент управления QueryExtender позволяет выполнять фильтрацию строк дочерней таблицы на основании внешних ключей, выбранных пользователем в родительской таблице.

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

На следующем рисунке показана фильтрация строк в таблицах, содержащих отношения "родитель-потомок", с помощью платформы динамических данных.

Элементы запроса динамических данных

НА рисунке показана следующая последовательность:

  1. Элемент управления с привязкой к родительским данным передает выбранный пользователем внешний ключ элементу управления QueryExtender.

  2. Элемент управления QueryExtender использует значение этого внешнего ключа для создания запроса фильтрации данных. Данные фильтрации передаются элементу управления источником данных для дочерних строк.

  3. Дочерний элемент управления источника данных передает данные запроса фильтрации поставщику источника данных.

  4. Поставщик источника данных передает запрос в базу данных.

  5. База данных возвращает отфильтрованные строки таблицы.

  6. Поставщик источника данных отправляет строки обратно дочернему элементу управления источника данных.

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

Проект Visual Studio с исходным кодом этого примера доступен на следующей странице: Scaffolding Dynamic Data.

Обязательные компоненты

  • Visual Studio 2010 или Visual Web Developer 2010, экспресс-выпуск.

  • Веб-сайт на платформе динамических данных. Дополнительные сведения см. в разделе Пошаговое руководство. Создание нового веб-узла, использующего формирование шаблонов.

  • На веб-сайте платформы динамических данных существует объект контекста модели данных с именем AdventureWorksLTDataContext. В этом пошаговом руководстве предполагается, что вы работаете с контекстом данных, имеющим имя. Если используется контекст модели данных с другим именем, следует запомнить это имя, чтобы далее в этом пошаговом руководстве подставлять именно его.

Отображение родительской таблицы

В этом разделе выполняется настройка родительской таблицы для выбора внешнего ключа. Создаваемая страница включает элемент управления LinqDataSource для доступа к базе данных, содержащей родительскую таблицу. Также предполагает задание элемента управления GridView для отображения родительской таблицы и предоставления пользователю возможности выбора значения внешнего ключа.

Отображение родительской таблицы

  1. В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите команду Добавить новый элемент.

  2. В разделе Установленные шаблоны выберите Visual Basic или Visual C#, а затем на правой панели выберите Веб-форма.

    В поле Имя введите "ParentChild.aspx" (без кавычек).

  3. Перейдите в представление Конструктор.

  4. На вкладке Данные в Панели элементов добавьте элемент управления DynamicDataManager на страницу.

    Для того чтобы элементы управления с привязкой к данным использовали поддержку платформы динамических данных, необходимо в состав страницы включить элемент управления DynamicDataManager. Разметка элемента управления DynamicDataManager должна предшествовать разметке любых других элементов управления, использующих платформу динамических данных. Элементы управления с привязкой к данным будут добавлены позднее.

  5. На вкладке Данные в Панели элементов добавьте элемент управления LinqDataSource на страницу.

  6. В меню Задачи LinqDataSource выберите команду Настройка источника данных.

    Отобразится диалоговое окно Выбор объекта контекста.

  7. В списке Выберите объект контекста выберите AdventureWorksLTDataContext.

    Примечание

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

  8. Нажмите кнопку Далее.

    Откроется диалоговое окно Настройка выбора данных.

  9. В списке Таблица выберите таблицу ProductCategories.

  10. В поле Выбрать установите флажок, помеченный звездочкой (*).

    При этом будут выбраны все столбцы таблицы ProductCategories.

  11. Нажмите кнопку Готово, чтобы закрыть окно Настройка выбора данных.

  12. Из группы Данные Панели элементов добавьте на страницу элемент управления GridView.

    Этот элемент управления используется для отображения родительской таблицы ProductCategories.

  13. В меню Задачи GridView перейдите к списку Выбор источника данных и выберите элемент LinqDataSource1.

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

  14. Выберите этот параметр, чтобы включить разбиение на страницы и выбор.

  15. Перейдите в представление Исходный код.

  16. Удалите все элементы управления BoundField из элемента Columns.

  17. Над элементом управления GridView вставьте следующую разметку:

    <h2>Parent Table: ProductCategories</h2>
    

    Это позволит отобразить заголовок, идентифицирующий данные.

  18. Задайте значение "true" свойству AutoGenerateColumns.

  19. Свойству SelectedIndex присвойте числовое значение. (Точное число не имеет особого значения, если оно не равно и не меньше числа элементов, отображаемых в сетке.)

    В следующем примере показано, как задать свойство элемента управления GridView.

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
      AutoGenerateColumns="True" SelectedIndex="4" 
      DataSourceID="LinqDataSource1">
      <Columns>
        <asp:CommandField ShowSelectButton="True" />
      </Columns>
    </asp:GridView>
    
  20. Перейдите в представление Конструктор.

  21. В меню Задачи DynamicDataManager выберите команду Регистрация элементов управления.

    Отобразится диалоговое окно Редактор коллекции DataControlReference.

  22. В области Члены щелкните Добавить.

    Запись DataControl отображается в поле Члены.

  23. В области Свойства DataControl выберите в списке ControlID элемент GridView1.

  24. Нажмите кнопку ОК.

  25. Сохраните файл ParentChild.aspx.

  26. Щелкните страницу правой кнопкой мыши и выберите команду Просмотреть в обозревателе.

    Откроется таблица ProductCategories.

Настройка дочерней таблицы для отображения отфильтрованных строк

В этом разделе выполняется настройка дочерней таблицы для отображения отфильтрованных строк. Настройка предполагает задание параметра элементу управления LinqDataSource для доступа к базе данных, содержащей дочернюю таблицу. Кроме того задается элемент управления GridView для отображения отфильтрованных строк дочерней таблицы.

Настройка дочерней таблицы для отображения отфильтрованных строк

  1. В файле ParentChild.aspx перейдите в представление Конструктор.

  2. На вкладке Данные в Панели элементов добавьте элемент управления LinqDataSource на страницу.

  3. В списке Задачи LinqDataSource выберите команду Настройка источника данных.

    Отобразится диалоговое окно Выбор объекта контекста.

  4. В списке Выберите объект контекста выберите AdventureWorksLTDataContext.

  5. Нажмите кнопку Далее.

    Откроется диалоговое окно Настройка выбора данных.

  6. В списке Таблица выберите таблицу Products.

  7. В поле Выбрать установите флажок, помеченный звездочкой (*).

    При этом будут выбраны все столбцы таблицы Products.

  8. Нажмите кнопку Готово.

  9. Из группы Данные Панели элементов добавьте на страницу элемент управления GridView.

    Этот элемент управления используется для отображения родительской таблицы Products.

  10. В меню Задачи GridView перейдите к списку Выбор источника данных и выберите элемент LinqDataSource2.

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

  11. Выберите этот параметр, чтобы включить разбиение на страницы и выбор.

  12. Перейдите в представление Исходный код.

  13. Удалите все элементы управления BoundField из элемента Columns.

  14. Над элементом управления GridView вставьте следующую разметку:

    <h2>Child Table: Products</h2>
    

    Это позволит отобразить заголовок, идентифицирующий данные.

  15. Установите для свойства AutoGenerateColumns значение true.

  16. Свойству SelectedIndex присвойте числовое значение. (Точное число не имеет особого значения, если оно не равно и не меньше числа элементов, отображаемых в сетке.)

    Следующий пример показывает задание связанных свойств.

    <asp:GridView ID="GridView2"  runat="server" 
      DataSourceID="LinqDataSource2" 
      AutoGenerateColumns="True"
      PageSize="5"> 
    </asp:GridView>
    
  17. Перейдите в представление Конструктор.

  18. В меню Задачи DynamicDataManager выберите команду Регистрация элементов управления.

    Отобразится диалоговое окно Редактор коллекции DataControlReference.

  19. В области Члены нажмите кнопку Добавить.

    Запись DataControl отображается в поле Члены.

  20. В области Свойства DataControl выберите в списке ControlID элемент GridView2.

  21. Нажмите кнопку ОК.

  22. Сохраните файл ParentChild.aspx.

  23. Щелкните страницу правой кнопкой мыши и выберите команду Просмотреть в обозревателе.

    Откроется таблица Products.

Настройка фильтрации строк дочерней таблицы

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

Настройка фильтрации строк дочерней таблицы

  1. Перейдите в представление Исходный код.

  2. Добавьте на страницу ParentChild.aspx элемент управления QueryExtender.

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

    В следующем примере показана разметка элемента управления QueryExtender, указывающего элемент управления источника данных LinqDataSource2, связанного с дочерней таблицей.

    <asp:QueryExtender ID="QueryExtenderID" 
        TargetControlID="LinqDataSource2" runat="server" >
    </asp:QueryExtender>
    
  4. Добавьте объект ControlFilterExpression в качестве дочернего объекта элемента управления QueryExtender.

    В следующем примере приведена разметка для добавления объекта ControlFilterExpression в элемент управления.

    <asp:QueryExtender  ID="QueryExtenderID"
        TargetControlID="LinqDataSource2" runat="server">
      <asp:ControlFilterExpression />
    </asp:QueryExtender>  
    
  5. Задайте свойству ControlID объекта ControlFilterExpression значение идентификатора элемента управления с привязкой к данным, связанного с родительской таблицей.

  6. Назначьте свойству Column объекта ControlFilterExpression столбец родительской таблицы, используемый для фильтрации.

    Этот столбец представляет внешний ключ в дочерней таблице.

    В следующем примере показана разметка для объекта ControlFilterExpression, указывающего на элемент управления с привязкой к данным и внешний ключ, связанный с родительской таблицей.

    <asp:QueryExtender  ID="QueryExtenderID"
        TargetControlID="LinqDataSource2" runat="server">
      <asp:ControlFilterExpression
          ControlID="GridView1"
          Column="ProductCategory" />
    </asp:QueryExtender>
    
  7. Сохраните файл ParentChild.aspx.

  8. В Обозревателе решений щелкните правой кнопкой мыши страницу ParentChild.aspx, а затем выберите команду Просмотр в обозревателе.

  9. Выберите категорию в родительской таблице ProductCategories.

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

Пример

В следующем примере показана полная страница, созданная в этом пошаговом руководстве.

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    <asp:DynamicDataManager ID="DynamicDataManager1" runat="server" >
    <DataControls>
        <asp:DataControlReference ControlID="GridView1" />
        <asp:DataControlReference ControlID="GridView2" />
    </DataControls>
    </asp:DynamicDataManager>
    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AdventureWorksLTDataContext" EntityTypeName="" 
        TableName="ProductCategories">
    </asp:LinqDataSource>

    <h2>Parent Table: ProductCategories</h2>
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
        AutoGenerateColumns="True" DataKeyNames="ProductCategoryID"  
        SelectedIndex="4"
        DataSourceID="LinqDataSource1">
        <Columns>
            <asp:CommandField ShowSelectButton="True" />
        </Columns>
    </asp:GridView>


    <asp:LinqDataSource ID="LinqDataSource2" runat="server" 
        ContextTypeName="AdventureWorksLTDataContext" EntityTypeName="" 
        TableName="Products">
    </asp:LinqDataSource>

    <h2>Child Table: Products</h2>
    <asp:GridView ID="GridView2" runat="server" AllowPaging="True" 
        AutoGenerateColumns="True" DataKeyNames="ProductID" PageSize="5"
        DataSourceID="LinqDataSource2">
        <Columns>
            <asp:CommandField ShowSelectButton="True" />

        </Columns>
    </asp:GridView>

    <asp:QueryExtender ID="QueryExtenderID" 
        TargetControlID="LinqDataSource2" runat="server" >
             <asp:ControlFilterExpression
                ControlID="GridView1"
                Column="ProductCategory" />
    </asp:QueryExtender>


    </form>
</body>
</html>
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

    <asp:DynamicDataManager ID="DynamicDataManager1" runat="server">
    <DataControls>
        <asp:DataControlReference ControlID="GridView1" />
        <asp:DataControlReference ControlID="GridView2" />
    </DataControls>
    </asp:DynamicDataManager>

    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AdventureWorksLTDataContext" EntityTypeName="" 
        TableName="ProductCategories">
    </asp:LinqDataSource>

    <h2>Parent Table: ProductCategories</h2>
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
        AutoGenerateColumns="True" DataKeyNames="ProductCategoryID"
        PageSize="5" SelectedIndex="5" 
        DataSourceID="LinqDataSource1">
        <Columns>
            <asp:CommandField ShowSelectButton="True" />
        </Columns>
    </asp:GridView>

    <asp:LinqDataSource ID="LinqDataSource2" runat="server" 
        ContextTypeName="AdventureWorksLTDataContext" EntityTypeName="" 
        TableName="Products">
    </asp:LinqDataSource>

    <h2>Child Table: Products</h2>

    <asp:GridView ID="GridView2" runat="server" AllowPaging="True" 
        AutoGenerateColumns="True" DataKeyNames="ProductID"
        PageSize="5" 
        DataSourceID="LinqDataSource2">
        <Columns>
            <asp:CommandField ShowSelectButton="True" />

        </Columns>
    </asp:GridView>

    <asp:QueryExtender ID="QueryExtenderID" 
     TargetControlID="LinqDataSource2" runat="server">
     <asp:ControlFilterExpression ControlID="Gridview1" Column="ProductCategory" /> 
    </asp:QueryExtender>


    </form>
</body>
</html>

Следующие действия

В этом пошаговом руководстве были показаны основные принципы обеспечения автоматической фильтрации данных в таблицах с отношениями "родитель-потомок". Можно также поэкспериментировать с дополнительными возможностями. Ниже приведены некоторые дополнительные рекомендации.

  • Описание способов выполнения фильтрации строк таблицы с помощью внешних ключей в той же таблице, где выполняется фильтрация. Дополнительные сведения и примеры см. в разделе DynamicFilter.

  • Описание выполнения фильтрации строк таблицы с помощью поддерживаемых типов столбцов (логических значений, внешних ключей и перечислений). Дополнительные сведения и примеры см. в разделе QueryableFilterRepeater.

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

Чтобы получить общие сведения, можно сделать следующее.

  • Рассмотрите объектно-реляционное сопоставление LINQ-to-SQL. Дополнительные сведения см. в разделе LINQ to SQL.

  • Рассмотрите реляционный конструктор объектов. Дополнительные сведения см. в разделе Реляционный конструктор объектов.

См. также

Задачи

Практическое руководство. Создание классов LINQ to SQL в веб-проекте

Ссылки

DynamicFilter

QueryableFilterRepeater