Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После добавления к родительскому отчету операции детализации следующий шаг состоит в создании фильтра данных для таблицы данных, которая определена в дочернем отчете.
Для отчета с детализацией можно создать табличный фильтр или фильтр по запросу. На этом занятии приведены указания по обоим вариантам.
Фильтр на основе таблиц
Для реализации фильтра на основе таблицы необходимо выполнить следующие задачи.
Добавить выражение фильтра для табликса в дочернем отчете.
Создать функцию, которая выбирает нефильтрованные данные из таблицы PurchaseOrderDetail .
Добавить обработчик событий, который связывает таблицу данных PurchaseOrderDetail с дочерним отчетом.
Добавьте выражение фильтра в табликс в дочернем отчете
Откройте дочерний отчет.
Выберите заголовок столбца в табликсе, щелкните правой кнопкой мыши серую ячейку, которая отображается над заголовком столбца, а затем выберите "Свойства Табликса".
Выберите страницу "Фильтры" и нажмите кнопку "Добавить".
В поле Выражение выберите ProductID из выпадающего списка. В этом столбце применяется фильтр.
Выберите оператор equal (=) в выпадающем списке Operator .
Нажмите кнопку выражения рядом с полем "Значение ", выберите "Параметры " в области "Категория ", а затем дважды щелкните productid в области "Значения ". Поле Задать выражение для: Значение теперь должно содержать выражение, аналогичное =Parameters!productid.Value.
В диалоговом окне Свойства табликса нажмите кнопку ОК , а затем нажмите кнопку ОК еще раз.
Сохраните RDLC-файл.
Создание функции, которая выбирает нефильтрованные данные из таблицы PurchaseOrderDetail
В обозревателе решений разверните Default.aspx, а затем дважды щелкните Default.aspx.cs.
Создайте новую функцию, которая принимает параметр, называемый productid типа Integer. Он должен возвращать объект datatable и выполнять следующие действия:
Создайте экземпляр набора данных DataSet2, который был создан на шаге 2 в уроке 4: определение подключения к данным и таблицы данных для дочернего отчета.
Создайте подключение к базе данных SqlServer для выполнения запроса, определенного в занятии 4. Определение подключения к данным и таблицы данных для дочернего отчета.
Запрос возвращает нефильтрованные данные.
Заполнение экземпляра набора данных нефильтрованными данными путем выполнения запроса.
Возвращает таблицу данных PurchaseOrderDetail .
Функция должна выглядеть примерно так, как показано в следующем примере (этот пример предназначен только для ссылки. Вы можете следовать любому нужному шаблону, чтобы получить необходимые данные для дочернего отчета).
/// <summary> /// Function to query PurchaseOrderDetail table, fetch the /// unfiltered data and bind it with the Child report /// </summary> /// <returns>A dataTable of type PurchaseOrderDetail</returns> private DataTable GetPurchaseOrderDetail() { try { //Create the instance for the typed dataset, DataSet2 which will //hold the [PurchaseOrderDetail] table details. //The dataset was created as part of the tutorial in Step 4. DataSet2 ds = new DataSet2(); //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2022;Integrated Security=SSPI")) { //Building the dynamic query with the parameter ProductID. SqlDataAdapter adap = new SqlDataAdapter("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail ", sqlconn); //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data. adap.Fill(ds, "PurchaseOrderDetail"); } //Return the PurchaseOrderDetail table for the Report Data Source. return ds.PurchaseOrderDetail; } catch { throw; } }
Добавьте обработчик события, который привязывает таблицу данных PurchaseOrderDetail к дочернему отчету
Откройте страницу Default.aspx в представлении конструктора.
Щелкните правой кнопкой мыши элемент управления ReportViewer и выберите пункт Свойства.
На странице Свойства щелкните значок События .
Дважды щелкните событие Drillthrough.
Это действие добавляет раздел обработчика событий в код, который должен выглядеть примерно так, как показано в следующем блоке.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }Завершите обработчик событий. Он должен выполнять следующие функции.
Получите ссылку на объект дочернего отчета из параметра DrillthroughEventArgs.
Вызов функции GetPurchaseOrderDetail.
Привязка таблицы данных PurchaseOrderDetail к соответствующему источнику данных отчета.
Готовый код обработчика событий должен выглядеть примерно так, как показано в следующем примере.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { try { //Get the instance of the Target report. LocalReport report = (LocalReport)e.Report; //Binding the DataTable to the Child report dataset. //The name DataSet1 which can be located from, //Go to Design view of Child.rdlc, Click View menu -> Report Data //You'll see this name under DataSet2. report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail())); } catch (Exception ex) { Response.Write(ex.Message); } }
Сохраните файл.
Фильтр запроса
Для реализации фильтра с запросом необходимо выполнить следующие задачи.
Создание функции, которая выбирает фильтрованные данные из таблицы PurchaseOrderDetail .
Добавьте обработчик событий, который извлекает значения параметров и привязывает PurchaseOrderDetail DataTable к дочернему отчету.
Создание функции, которая выбирает отфильтрованные данные из таблицы PurchaseOrderDetail
В обозревателе решений разверните Default.aspx, а затем дважды щелкните Default.aspx.cs.
Создайте функцию, которая принимает параметр productidтипа Integer, возвращает объект datatable и выполняет указанные ниже действия.
Создает экземпляр набора данных DataSet2, который был создан на шаге 2 урока 4: Определение подключения к данным и таблицы данных для вложенного отчета.
Создайте подключение к базе данных SqlServer для выполнения запроса, определенного в занятии 4. Определение подключения к данным и таблицы данных для дочернего отчета.
Запрос содержит параметр, productid, чтобы убедиться, что возвращенные данные фильтруются по идентификатору ProductID, выбранному в родительском отчете.
Заполнение экземпляра набора данных фильтрованными данными путем выполнения запроса.
Возвращает таблицу данных PurchaseOrderDetail .
Функция должна выглядеть примерно так, как показано в следующем примере (этот пример предназначен только для ссылки. Вы можете следовать любому нужному шаблону, чтобы получить необходимые данные для дочернего отчета).
/// <summary> /// Function to query PurchaseOrderDetail table and filter the /// data for a specific ProductID selected in the Parent report. /// </summary> /// <param name="productid">Parameter passed from the Parent report to filter data.</param> /// <returns>A dataTable of type PurchaseOrderDetail</returns> private DataTable GetPurchaseOrderDetail(int productid) { try { //Create the instance for the typed dataset, DataSet2 which will //hold the [PurchaseOrderDetail] table details. //The dataset was created as part of the tutorial in Step 4. DataSet2 ds = new DataSet2(); //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks2022;Integrated Security=SSPI")) { //Building the dynamic query with the parameter ProductID. SqlCommand cmd = new SqlCommand("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail where ProductID = @ProductID", sqlconn); // Sets the productid parameter. cmd.Parameters.Add((new SqlParameter("@ProductID", SqlDbType.Int)).Value = productid); SqlDataAdapter adap = new SqlDataAdapter(cmd); //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data. adap.Fill(ds, "PurchaseOrderDetail"); } //Return the PurchaseOrderDetail table for the Report Data Source. return ds.PurchaseOrderDetail; } catch { throw; } }
Добавление обработчика событий, который извлекает значения параметров и привязывает объект PurchaseOrderDetail DataTable к дочернему отчету
Откройте страницу Default.aspx в представлении конструктора.
Щелкните правой кнопкой мыши элемент управления ReportViewer и выберите пункт Свойства.
На панели Свойства щелкните значок События .
Дважды щелкните событие Drillthrough.
Это действие добавляет раздел обработчика событий в код, который должен выглядеть примерно так, как показано в следующем примере.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }Завершите обработчик событий. Он должен выполнять следующие функции.
Получите ссылку на объект дочернего отчета из параметра DrillthroughEventArgs.
Получение списка параметров дочернего отчета из имеющегося объекта дочернего отчета.
Выполните итерацию по коллекции параметра и получите значение параметра ProductID, переданного из родительского отчета.
Вызов функции GetPurchaseOrderDetail. и передача значения параметра ProductID.
Привязка таблицы данных PurchaseOrderDetail к соответствующему источнику данных отчета.
Готовый код обработчика событий должен выглядеть примерно так, как показано в следующем примере.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { try { //Variable to store the parameter value passed from the MainReport. int productid = 0; //Get the instance of the Target report. LocalReport report = (LocalReport)e.Report; //Get all the parameters passed from the main report to the target report. //OriginalParametersToDrillthrough actually returns a Generic list of //type ReportParameter. IList<ReportParameter> list = report.OriginalParametersToDrillthrough; //Parse through each parameters to fetch the values passed along with them. foreach (ReportParameter param in list) { //Since we know the report has only one parameter and it is not a multivalued, //we can directly fetch the first value from the Values array. productid = Convert.ToInt32(param.Values[0].ToString()); } //Binding the DataTable to the Child report dataset. //The name DataSet1 which can be located from, //Go to Design view of Child.rdlc, Click View menu -> Report Data //You'll see this name under DataSet2. report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail(productid))); } catch (Exception ex) { Response.Write(ex.Message); } }
Сохраните файл.