отчет с иерархическими бизнес объектами

ibnibn
отредактировано 17:42 Раздел: FastReport .NET
есть вот такой код
rep.RegisterData(providerList, "providerList", BOConverterFlags.AllowFields, 3);
                    
                    rep.GetDataSource("providerList").Enabled = true;
                    ((DataBand)rep.FindObject("DataMaster")).DataSource = rep.GetDataSource("providerList");

                    ((TextObject)rep.FindObject("textProviderName")).Text = "[providerList.ProviderName]";

                    ((TextObject) rep.FindObject("textSerivce")).Text = "[providerList.PaymentByServiceList.ServiceName]";

                    ((TextObject) rep.FindObject("textAmountOfPayment")).Text = "[providerList.PaymentByServiceList.PaymentSum]";
список из providerList загружается правильно а вот во вложенном списке для каждого элемента providerList-a повторяется одно и то же значение из первого элемента providerList-a см. в прикрепленном файле. Хотелось бы узнать как сделать правильно

Комментарии

  • отредактировано 17:42
    Прикрепите, пожалуйста, файл отчета.
  • ibnibn
    отредактировано 17:42
    вот
  • ibnibn
    отредактировано 17:42
    пробовал сделать вот так
    DataSet ds = new DataSet();
                        DataTable dtMaster = new DataTable("master");
                        dtMaster.Columns.Add("id", typeof(int));
                        dtMaster.Columns.Add("providerName", typeof(string));
                        dtMaster.PrimaryKey = new[] {dtMaster.Columns["id"]};
    
                        DataTable dtDetail = new DataTable("detail");
                        dtDetail.Columns.Add("id", typeof(int));
                        dtDetail.Columns.Add("providerId", typeof(int));
                        dtDetail.Columns.Add("serviceName", typeof(string));
                        dtDetail.Columns.Add("paymentSum", typeof(decimal));
    
                        ds.Tables.Add(dtMaster);
                        ds.Tables.Add(dtDetail);
    
                        foreach (var providerData in providerList)
                        {
                            dtMaster.Rows.Add(providerData.id, providerData.ProviderName);
                            foreach (var service in providerData.PaymentByServiceList)
                            {
                                dtDetail.Rows.Add(service.id, service.ProviderId, service.ServiceName, service.PaymentSum);
                            }
                        }
    
                        DataRelation dr = new DataRelation("rel", dtMaster.Columns["id"], dtDetail.Columns["providerId"]);
    
                        ds.Relations.Add(dr);
    
                        rep.RegisterData(ds, "data");
    
    результат тот же самый
  • отредактировано 17:42
    Вы прикрепляете DataMaster к источнику данных, а вот DataDetail остается пустым.
  • ibnibn
    отредактировано 17:42
    а что именно к нему прикреплять ведь его датасорс каждый раз разный? у вас в демонстрационном отчете кстати также
  • отредактировано 17:42
    К нему надо прикреплять источник providerList.PaymentByServiceList.
  • ibnibn
    отредактировано 17:42
    то есть вот так
    ((DataBand)rep.FindObject("DataDetail")).DataSource = rep.GetDataSource("providerList.PaymentByServiceList"); ?
  • ibnibn
    отредактировано 17:42
    спасибо вроде заработало
    будут вопросы напишу
  • отредактировано 17:42
    Да, можно так. Но почему Вы не делаете это в дизайнере? Его можно вызвать из своей программы, предварительно зарегистрировав данные, вот так:

    Для создания отчета, выполните следующий код:
    using (Report report = new Report())
    {
      // зарегистрируйте любые данные, которые могут понадобиться в отчете
      report.RegisterData(...);
      report.Design();
    }
    
    Этот код можно повесить на обработчик события Click какой-либо кнопки в вашем приложении. Нажав на кнопку, вы запускаете дизайнер отчетов, создаете отчет и сохраняете его в файл. После того как все отчеты созданы, кнопку, вызывающую дизайнер, можно убрать.

    Чтобы использовать этот отчет в дальнейшем, выполните следующий код:
    using (Report report = new Report())
    {
      report.Load("your_report.frx");
      // зарегистрируйте те же самые данные, что и при вызове дизайнера
      report.RegisterData(...);
      report.Show();
    }
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.