بازخوردهای پروژه‌ها
گزارش خاص
با سلام
ضمن تشکر از شما
سوالی داشتم که آیا امکان ساخت گزارش به شمایل زیر وجود داره و اگر بله چطوری ؟

من از این روش استفاده کردم ولی جواب کار من رو نداد :

   columns.AddColumn(column =>
                                      {
                                          column.PropertyName("Discount");
                                          column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                                          column.IsVisible(true);
                                          column.Order(5);
                                          column.Width(4);
                                          column.HeaderCell("تخفیف");
                                          column.CalculatedField(
                                          list =>
                                          {
                                              if (list == null)
                                                  return string.Empty;
                                              var amountLesson = list.GetValueOf<sp_Lesson_Peresent_Rpt_Financial_DetailResult>(x => x.AmountLesson);
                                              var discount = list.GetValueOf<sp_Lesson_Peresent_Rpt_Financial_DetailResult>(x => x.Discount);
                                              if (amountLesson == "")
                                              {
                                                  column.Width(0);
                                                  return null;
                                              }
                                              else
                                                  return discount;

                                          });
                                      });
                                      columns.AddColumn(column =>
                                      {
                                          column.PropertyName("DiscountPercents");
                                          column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                                          column.IsVisible(true);
                                          column.Order(6);
                                          column.Width(14);
                                          column.HeaderCell("درصد و نوع تخفیف");
                                          column.CalculatedField(
                                          list =>
                                          {
                                              if (list == null)
                                                  return string.Empty;
                                              var amountLesson = list.GetValueOf<sp_Lesson_Peresent_Rpt_Financial_DetailResult>(x => x.AmountLesson);                                             
                                              var discountPercents = list.GetValueOf<sp_Lesson_Peresent_Rpt_Financial_DetailResult>(x => x.DiscountPercents);
                                              if (amountLesson == "")
                                              {
                                                  column.Width(15);
                                                  var decriptions = list.GetValueOf<sp_Lesson_Peresent_Rpt_Financial_DetailResult>(x => x.DESCRIPTION);
                                                  return decriptions;
                                              }
                                              else
                                                  return discountPercents;

                                          });
                                      });

متشکرم از شما

بازخوردهای پروژه‌ها
خطای sql?
ببخشید برای بازخورد قبلیم جایی برای ویرایش پیدا نکرم.
کد کامل کلاس من به این صورته:
 class SQLiteDataReaderPdfReport
    {
        public IPdfReportData CreatePdfReport()
        {
           
                return new PdfReport().DocumentPreferences(doc =>
                {
                    doc.RunDirection(PdfRunDirection.RightToLeft);
                    doc.Orientation(PageOrientation.Portrait);
                    doc.PageSize(PdfPageSize.A4);
                    doc.DocumentMetadata(new DocumentMetadata { Author = "Vahid", Application = "PdfRpt", Keywords = "Test", Subject = "Test Rpt", Title = "Test" });
                })
                .DefaultFonts(fonts =>
                {
                    fonts.Path(System.AppDomain.CurrentDomain.BaseDirectory + "\\fonts\\BMitra.ttf",
                                      Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf");
                })
                .PagesFooter(footer =>
                {
                    footer.DefaultFooter(DateTime.Now.ToString("MM/dd/yyyy"));
                })
                .PagesHeader(header =>
                {
                    header.DefaultHeader(defaultHeader =>
                    {
                        defaultHeader.RunDirection(PdfRunDirection.RightToLeft);
                        defaultHeader.ImagePath(System.AppDomain.CurrentDomain.BaseDirectory + "\\Images\\s.jpg");
                        defaultHeader.Message("لیست دانشجویان");
                    });
                })
                .MainTableTemplate(template =>
                {
                    template.BasicTemplate(BasicTemplate.SilverTemplate);
                })
                .MainTablePreferences(table =>
                {
                    table.ColumnsWidthsType(TableColumnWidthType.Relative);
                    table.NumberOfDataRowsPerPage(5);
                })
                .MainTableDataSource(dataSource =>
                {
                    dataSource.GenericDataReader(
                        providerName: "System.Data.SQLite",
                        connectionString: "Data Source=" + System.AppDomain.CurrentDomain.BaseDirectory + "\\data\\database.sqlite",
                        sql: @"SELECT id,name,family,mark
                               FROM Student
                                WHERE id='1'",
                             

                        parametersValues: new object[] { 10 }
                    );
                })

                .MainTableColumns(columns =>
                {
                    columns.AddColumn(column =>
                    {
                        column.PropertyName("id");
                        column.IsRowNumber(true);
                        column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                        column.IsVisible(true);
                        column.Order(0);
                        column.Width(2);
                        column.HeaderCell("کد");
                    });


                    columns.AddColumn(column =>
                    {
                        column.PropertyName("name");
                        column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                        column.IsVisible(true);
                        column.Order(1);
                        column.Width(2);
                        column.HeaderCell("نام");
                    });

                    columns.AddColumn(column =>
                    {
                        column.PropertyName("family");
                        column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                        column.IsVisible(true);
                        column.Order(2);
                        column.Width(2);
                        column.HeaderCell("نام خانوادگی");
                    });

                    columns.AddColumn(column =>
                    {
                        column.PropertyName("mark");
                        column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                        column.IsVisible(true);
                        column.Order(3);
                        column.Width(2);
                        column.HeaderCell("نمره");
                    });
                })
                .MainTableEvents(events =>
                {
                    events.DataSourceIsEmpty(message: "There is no data available to display.");
                })
                .Export(export =>
                {
                    export.ToExcel();
                })
                .Generate(data => data.AsPdfFile(System.AppDomain.CurrentDomain.BaseDirectory + "\\Pdf\\RptSqlDataReaderSample.pdf"));
           
        }
        
    }
}
به خاطر توجهی که کردید سپاسگزارم!
بازخوردهای پروژه‌ها
اعمال نشدن گروهبندی
با سلام. چرا گروهبندی بر روی خروجی اعمال نمی‌شود؟
کلاس هدر گزارش:
 public class CH_Rpt_Report1 : IPageHeader
    {

        public TermViewModel TermInfo { get; set; }
        public string StartDate { get; set; }
        public string EndDate { get; set; } 

        public CH_Rpt_AllTeacherAbsents(TermViewModel termInfo, string startDate, string endDate)
        {
            TermInfo = termInfo;
            StartDate = startDate;
            EndDate = endDate; 
        }
        public CH_Rpt_AllTeacherAbsents()
        {

        }
        public IPdfFont PdfRptFont { set; get; }

        public PdfGrid RenderingReportHeader(Document pdfDoc, PdfWriter pdfWriter, IList<SummaryCellData> summaryData)
        {
            var rootGrid = new PdfGrid(1);
            rootGrid.DefaultCell.BorderWidth = 0;
            rootGrid.WidthPercentage = 100;

           ...

            return grid;
        }
      
        public PdfGrid RenderingGroupHeader(Document pdfDoc, PdfWriter pdfWriter, IList<CellData> newGroupInfo, IList<SummaryCellData> summaryData)
        {
            var teacherCode = newGroupInfo.GetSafeStringValueOf<TeachersAbsentRow>(p => p.TeacherCode);
            var teacherFullName = newGroupInfo.GetSafeStringValueOf<TeachersAbsentRow>(p => p.TeacherFullName);
            var table = new PdfGrid(1)
            {
                WidthPercentage = 100,
                HorizontalAlignment = PdfWriter.RUN_DIRECTION_RTL,
                RunDirection = PdfWriter.RUN_DIRECTION_RTL
            };
            table.AddSimpleRow((cellData, cellProperties) =>
            {
                cellData.Value = (teacherFullName + " - " + teacherCode).FixWeakCharacters();
                //cellData.Value = (teacherFullName);
                cellProperties.PdfFont = FontHelper.GetIPdfFont(FontHelper.GetFontPath(FarsiFonts.BYekan), new BaseColor(Color.Gray), 12);
                cellProperties.HorizontalAlignment = HorizontalAlignment.Right;
            });

            return table.AddBorderToTable(borderColor: BaseColor.LIGHT_GRAY, spacingBefore: 5f);
        }

    }
کلاس گزارش:
public class Rpt_AllTeacherAbsents : IReportBase
    {
        #region IReportBase

        public string ReportFileName { get; set; }

        #endregion IReportBase

        #region Properties

        public bool ShowTeacherInSeperatePage { get; set; }
        public List<TeachersAbsentRow> DataSource { get; set; }
        public string StartDate { get; set; }
        public string EndDate { get; set; }
        public bool ShowFooter { get; set; }
        public TermViewModel Term { get; set; }

        #endregion Properties

        #region Constructors

        public Rpt_AllTeacherAbsents()
        {
        }

        public Rpt_AllTeacherAbsents(List<TeachersAbsentRow> dataSource, TermViewModel term, string startDate = "", string endDate = "", bool showFooter = true, bool showTeacherInSeperatePage = false)
        {
            ShowFooter = showFooter;
            DataSource = dataSource;
            Term = term;
            StartDate = startDate;
            EndDate = endDate;
            ShowTeacherInSeperatePage = showTeacherInSeperatePage;
        }

        #endregion Constructors

        public IPdfReportData Create()
        {
            return new PdfReport()
            .DocumentPreferences(doc =>
            {
                doc.RunDirection(PdfRunDirection.RightToLeft);
                doc.Orientation(PageOrientation.Landscape);
                doc.PageSize(PdfPageSize.A4);
                doc.DocumentMetadata(new DocumentMetadata
                {
                     ...
                });
            })
            .DefaultFonts(fonts =>
            {
                fonts.Size(8);
                fonts.Path(FontHelper.GetFontPath(FarsiFonts.BYekan),
                    //fonts.Path(Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\BYekan.ttf",
                 Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf");
            })
            .PagesFooter(footer =>
            {
                #region Footer

                if (ShowFooter)
                {
                    footer.XHtmlFooter(rptFooter =>
                    {
                        IPdfFont ipf = footer.PdfFont;
                        ipf.Size = 9;
                        rptFooter.PageFooterProperties(new XFooterBasicProperties
                        {
                            RunDirection = PdfRunDirection.RightToLeft,
                            ShowBorder = true,
                            PdfFont = ipf,
                            TotalPagesCountTemplateHeight = 10,
                            TotalPagesCountTemplateWidth = 50,
                            SpacingBeforeTable = 25f,
                            InlineCss = "border:0px solid;border-top:1px solid black;"
                        });
                        //RazorMachine rm = new RazorMachine();
                        rptFooter.AddPageFooter(pageFooter =>
                        {
                            return HeaderAndFooterUtility.InitCommonFooter(Term, pageFooter);
                        });
                    });
                }

                #endregion
            })
            .PagesHeader(header =>
            {
                header.CustomHeader(new CH_Rpt_AllTeacherAbsents(Term, StartDate, EndDate)
                {
                    PdfRptFont = header.PdfFont
                });
            })
            .MainTableTemplate(template =>
            {
                template.CustomTemplate(new GrayTemplate(false));
            })
            .MainTablePreferences(table =>
            {
                #region

                table.ShowHeaderRow(true);
                table.SpacingAfter(10f);
                table.ColumnsWidthsType(TableColumnWidthType.Absolute);
                table.NumberOfDataRowsPerPage(0);
                table.GroupsPreferences(new GroupsPreferences
                {
                    GroupType = GroupType.HideGroupingColumns,
                    SpacingBeforeAllGroupsSummary = 1f,
                    SpacingAfterAllGroupsSummary = 5,
                    NewGroupAvailableSpacingThreshold = 30,
                    RepeatHeaderRowPerGroup = true,
                    ShowOneGroupPerPage = ShowTeacherInSeperatePage,
                });

                #endregion
            })
            .MainTableDataSource(dataSource =>
            {
                dataSource.StronglyTypedList<TeachersAbsentRow>(DataSource);
            })
            .MainTableSummarySettings(summarySettings =>
            {
                //summarySettings.OverallSummarySettings("جمع ساعات تدریس : ");
                // summarySettings.PreviousPageSummarySettings("Previous Page Summary");
                // summarySettings.PageSummarySettings("Page Summary");
            })
            .MainTableColumns(columns =>
            {
                #region Columns

                columns.AddColumn(column =>
                {
                    column.PropertyName("rowNo");
                    column.IsRowNumber(true);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(0);
                    column.Width(40);
                    column.HeaderCell("#", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.TeacherCode);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(100);
                    column.HeaderCell("کد استاد", horizontalAlignment: HorizontalAlignment.Right);
                    column.Group(true, (val1, val2) =>
                    {
                        return val1.ToString() == val2.ToString();
                    });
                });
                
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.LessonCode);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Left);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(100);
                    column.HeaderCell("کد درس", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.LessonName);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(200);
                    column.HeaderCell("نام درس", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.Date);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(90);
                    column.HeaderCell("تاریخ", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.StartTimeToEndTime);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(120);
                    column.HeaderCell("ساعت", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.TrendCode);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(90);
                    column.HeaderCell("کد رشته", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.TrendName);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(180);
                    column.HeaderCell("عنوان رشته", horizontalAlignment: HorizontalAlignment.Center);
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName<TeachersAbsentRow>(x => x.PlaceFullName);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(130);
                    column.HeaderCell("مکان برگزاری", horizontalAlignment: HorizontalAlignment.Center);
                });

                #endregion
            })
            .MainTableEvents(events =>
            {
                #region Events

                #region Alternate Row Colors

                events.CellCreated(args =>
                {
                     
                });

                #endregion


                events.DataSourceIsEmpty(message: "داده ای برای مشاهده وجود ندارد.");
                events.CellCreated(args =>
                {
                    if (args.RowType == RowType.DataTableRow)
                    {

                    }
                });

                #endregion
            })
            .Export(export =>
            {

            })
            .Generate(data => data.AsPdfFile(ReportFileName));
        }

    }
مدل هم بصورت زیر است:
public class TeachersAbsentRow
    {
        public TeachersAbsentRow()
        {
            
        }
        public int Id { get; set; }
        public int ProgramId { get; set; }
        public string RowNumber { get; set; }
        public bool IsSelected { get; set; }


        public int TeacherId { get; set; }
        public string TeacherCode { get; set; }
        public string TeacherFullName { get; set; }
        public string TeacherFirstName { get; set; }
        public string TeacherLastName { get; set; }

        public string GroupNumber { get; set; }
        public string GroupDescription { get; set; }

        public string LessonId { get; set; }
        public string LessonCode { get; set; }
        public string LessonName { get; set; }
        public int LessonPresentationTerm { get; set; }

        public string TrendId { get; set; }
        public string TrendCode { get; set; }
        public string TrendName { get; set; }

        public string Date { get; set; }
        public string StartTime { get; set; }
        public string EndTime { get; set; }

        public string StartTimeToEndTime { get; set; }
        public string DayNumber { get; set; }
        public string DayTitle { get; set; }

        public int BuildingId { get; set; }
        public int PlaceId { get; set; }
        public string PlaceName { get; set; }
        public string BuildingName { get; set; }
        public string PlaceFullName { get; set; }
    }

نظرات مطالب
گروه بندی اطلاعات و گزارشات Master-Details در PdfReport

سلام. 

من یک View در SQL دارم که چند جدول مختلف را با هم Join میزند. 

رکوردها باید با فیلد ReceptionPatientId گروه بندی شوند.

کد برنامه:

 return new PdfReport().DocumentPreferences(doc =>
            {
                doc.RunDirection(PdfRunDirection.LeftToRight);
                doc.Orientation(PageOrientation.Portrait);
                doc.PageSize(PdfPageSize.A4);
                doc.DocumentMetadata(new DocumentMetadata
                {
                    Author = username,
                    Application = "",
                    Keywords = "Executive Unit Work List Report",
                    Subject = "Executive Unit Work List Report",
                    Title = "Executive Unit Work List Report"
                });
            })
           .DefaultFonts(fonts => fonts.Path(Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf",
                                             Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf"))
           .PagesFooter(footer => footer.DefaultFooter(DateTime.Now.ToLongPersianDate()))
           .PagesHeader(header =>
           {
               header.CustomHeader(new UnitWorkListHeader { PdfRptFont = header.PdfFont });
           })
           .MainTableTemplate(template => template.BasicTemplate(BasicTemplate.RainyDayTemplate))
           .MainTablePreferences(table =>
           {
               table.ColumnsWidthsType(TableColumnWidthType.Relative);
               table.GroupsPreferences(new GroupsPreferences
               {
                   GroupType = GroupType.HideGroupingColumns,
                   RepeatHeaderRowPerGroup = true,
                   ShowOneGroupPerPage = false,
                   SpacingBeforeAllGroupsSummary = 5f,
                   NewGroupAvailableSpacingThreshold = 170
               });
           })
           .MainTableDataSource(dataSource => 
               dataSource.DataTable(new ReceptionPatientBl(context).
               GetReceptionSummaryView(_rcpIds).
               ToDataSet(false).Tables[0]))
           .MainTableColumns(columns =>
           {
               columns.AddColumn(column =>
               {
                   column.PropertyName("rowNo");
                   column.IsRowNumber(true);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Left);
                   column.IsVisible(true);
                   column.Order(0);
                   column.Width(1);
                   column.HeaderCell("#");
               });
               columns.AddColumn(column =>
               {
                   column.PropertyName("ReceptionPatientId");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("ReceptionPatientId");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("ReceptionDate");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("ReceptionDate");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("IsDelete");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("IsDelete");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("Fname");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("Fname");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("Lname");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("Lname");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("Sex");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("Sex");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("BirthDate");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("BirthDate");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("Mobile");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("Mobile");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1 == val2;
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("LabId");
                   column.IsRowNumber(false);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(3);
                   column.Width(2);
                   column.HeaderCell("LabId");
                   column.Group(true,
                   (val1, val2) =>
                   {
                       return val1.ToString() == val2.ToString();
                   });
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("TestName");
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(4);
                   column.Width(2);
                   column.HeaderCell("نام تست");
                   column.IsVisible(true);
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName("TestShortName");
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.Order(5);
                   column.Width(2);
                   column.HeaderCell("نام اختصاری تست");
                   column.IsVisible(true);
               });

           })
           .MainTableEvents(events => events.DataSourceIsEmpty(message: "There is no data available to display."))
           //.Export(export =>
           //{
           //    export.ToExcel();
           //})
           .Generate(data =>
           {
               var fileName = "ExecutiveWorkListReport.pdf";
               fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
               data.FlushInBrowser(fileName);
           }); 
        }

اما خروجی به صورت زیر است:

همانطور که مشاهده می‌کنید بدون توجه به فیلد ID سه مرتبه این گروه تکرار شده است.

ممکن است راهنمایی فرمایید مشکل کار کجاست؟

بازخوردهای پروژه‌ها
خطای property not found
با سلام. 
در این قسمت دچار خطا می‌شوم(property not found)
columns.AddColumn(column =>
                {
                    column.PropertyName<WeekDayClassSessionSemiRow>(x => x.WD0.Percent);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Left);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(100);
                    column.HeaderCell("شنبه", horizontalAlignment: HorizontalAlignment.Left);
                    column.ColumnItemsTemplate(template =>
                    {
                        template.ProgressBar(Color.SkyBlue, true);
                        template.DisplayFormatFormula(obj =>
                        {
                            if (obj == null) return "% 0";
                            return "% " + obj.ToString();
                        });
                    });
                });
سوال بعدی اینکه آیا امکان دارد بر اساس مقدار سایر خاصیت‌ها ، برای ستون جاری دستورات شرطی ایجاد کنم ، مثلا رنگ progressBar را تغییر دهم؟
متشکرم.
بازخوردهای پروژه‌ها
تنظیم کردن فونت برای گزارش
با عرض سلام.  من برای ایجاد گزارش خودم کدهای زیر را نوشتم.
public IPdfReportData CreatePdfReport(int type,int RequestId)
        {
            return new PdfReport().DocumentPreferences(doc =>
            {
                doc.RunDirection(PdfRunDirection.RightToLeft);
                doc.Orientation(PageOrientation.Portrait);
                doc.PageSize(PdfPageSize.A4);
               
            })
            .DefaultFonts(fonts =>
            {
                fonts.Path(AppPath.ApplicationPath + "\\Fonts\\BNAZANIN.TTF",
                                  AppPath.ApplicationPath + "\\Fonts\\TIMES.TTF");
                fonts.Size(20);
            })
            .PagesFooter(footer =>
            {
                footer.DefaultFooter("");
                footer.PdfFont.Size = 8;

            })
            .PagesHeader(header =>
            {
                if (type == 1)
                {
                    header.CustomHeader(_customHeader);
                }
                else
                {
                    header.DefaultHeader(h => h.Message("mohsen"));
                }

            })
             .MainTableTemplate(template =>
             {
                 template.BasicTemplate(BasicTemplate.SilverTemplate);
             })
            .MainTablePreferences(table =>
            {
                table.ColumnsWidthsType(TableColumnWidthType.Relative);


            })
            .MainTableDataSource(dataSource =>
            {
               
                
                var ctx = new ClearanceEntities();




                var list = (from c in ctx.CLEARANCE_ITEMS
                            where c.CLEARANCE_REQUEST.REQUEST_ID == RequestId
                            select new
                            {
                                c.TARIFF_NO,
                                c.GOODS_DESCRIPTION,
                                vahed = c.QUANTITY,
                                c.PACKING_TYPES.PACKING_NAME,
                                c.GROSS_WEIGHT,
                                arzesh = (c.GOODS_PRICE * c.GOODS_CURRENCY_RATE) + (c.FREIGHT_PRICE * c.FREIGHT_CURRENCY_RATE),
                                hoghogh = " ",
                                sood = " "

                            }).ToList();
               



                dataSource.AnonymousTypeList(list );
            })

            .MainTableColumns(columns =>
            {
                columns.AddColumn(column =>
                {
                    column.PropertyName("TARIFF_NO");

                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(0);
                    column.Width(3);
                    column.HeaderCell("تعرفه");
                });
                columns.AddColumn(column =>
                {
                    column.PropertyName("GOODS_DESCRIPTION");
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);

                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(5);
                    column.HeaderCell("نام کالا");
                    column.ColumnItemsTemplate(template =>
                        {
                            new CellBasicProperties
                                {
                                  
                                    //PdfFontStyle = DocumentFontStyle.Bold | DocumentFontStyle.Underline,
                                    //FontColor = new BaseColor(System.Drawing.Color.Brown),
                                    //BackgroundColor = new BaseColor(System.Drawing.Color.Yellow)
                                };
                            return;
                        });

                });
                columns.AddColumn(column =>
                {
                    column.PropertyName("vahed");
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(5);
                    column.HeaderCell("واحد");

                });
                columns.AddColumn(column =>
                {
                    column.PropertyName("GROSS_WEIGHT");
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(5);
                    column.HeaderCell("وزن ناخالص");

                });
                columns.AddColumn(column =>
                {
                    column.PropertyName("arzesh");
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(5);
                    column.HeaderCell("ارزش دلاری");

                });
                columns.AddColumn(column =>
                {
                    column.PropertyName("hoghogh");
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(3);
                    column.HeaderCell("حقوق گمرکی");

                });
                columns.AddColumn(column =>
                {
                    column.PropertyName("sood");
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(3);
                    column.HeaderCell("سود بازرگانی");

                });


            })
            .MainTableEvents(events =>
            {
                events.DataSourceIsEmpty(message: "There is no data available to display.");

}

                 events.DocumentClosing(args =>
            {
                if (HttpContext.Current == null || HttpContext.Current.Response == null) return;

                // close the document without closing the underlying stream
                args.PdfWriter.CloseStream = false;
                args.PdfDoc.Close();
                args.PdfStreamOutput.Position = 0;

                // write pdf bytes to output stream
                var pdf = ((MemoryStream)args.PdfStreamOutput).ToArray();
                string str = Guid.NewGuid().ToString();
                HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                HttpContext.Current.Response.ContentType = MediaTypeNames.Application.Pdf;
                HttpContext.Current.Response.AddHeader("Content-Length", pdf.Length.ToString());
                HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + str + ".pdf");
                HttpContext.Current.Response.Buffer = true;
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.OutputStream.Write(pdf, 0, pdf.Length);
                HttpContext.Current.Response.OutputStream.Flush();
                HttpContext.Current.Response.OutputStream.Close();
                HttpContext.Current.Response.End();
            });
        })

           .Generate(data => data.AsPdfStream(new MemoryStream()));

همانطور که در قسمت DefaultFonts   اندازه فونت را 20 تعریف کردم ولی هیچ تاثیری در فونت گزارش من داده نمی‌شود. ممنون میشم راهنمایی کنید.

مطالب
نمایش درصد پیشرفت، Watermark و گزارشات چند ستونی در PdfReport
گزارشی را در نظر بگیرید با این نیازها:
می‌خواهیم
الف) یک Watermark قطری را بر روی تمام صفحات گزارش ظاهر کنیم.
ب) عدد‌های درصد پیشرفت یک ستون را به صورت میله‌ای نمایش دهیم.
ج) در هر صفحه بجای اینکه یک جدول، اطلاعات را نمایش دهد و تمام صفحه را پر کند، دو جدول در دو ستون کنار هم اینکار را انجام دهند تا در حین چاپ گزارش، در میزان تعداد صفحات مصرفی صرفه جویی صورت گیرد.
د) مقادیر true با چک مارک و موارد false با علامت ضربدر نمایش داده شوند.

یک چنین شکلی در نهایت مد نظر است:


روش انجام کار را توسط کتابخانه PdfReport در ادامه بررسی خواهیم کرد.
ابتدا کلاس مدل زیر را در نظر بگیرید:
namespace PdfReportSamples.Models
{
    public class Task
    {
        public int Id { set; get; }
        public string Name { set; get; }
        public int PercentCompleted { set; get; }
        public bool IsActive { set; get; }
    }
}
به این ترتیب یک کلاس فعالیت تعریف شده است که در آن نام فعالیت، درصد پیشرفت و همچنین درجریان بودن آن قابل تنظیم است. از این کلاس جهت تهیه منبع داده گزارش استفاده می‌شود:
using System;
using System.Collections.Generic;
using System.Drawing;
using iTextSharp.text;
using PdfReportSamples.Models;
using PdfRpt;
using PdfRpt.Core.Contracts;
using PdfRpt.Core.Helper;
using PdfRpt.FluentInterface;

namespace PdfReportSamples.ProgressReport
{
    public class ProgressReportPdfReport
    {
        private IPdfFont getWatermarkFont()
        {
            var watermarkFont = new GenericFontProvider(
                                        AppPath.ApplicationPath + "\\fonts\\irsans.ttf",
                                        Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf");
            watermarkFont.Color = BaseColor.LIGHT_GRAY;
            watermarkFont.Size = 50;
            return watermarkFont;
        }

        public IPdfReportData CreatePdfReport()
        {
            return new PdfReport().DocumentPreferences(doc =>
            {
                doc.RunDirection(PdfRunDirection.RightToLeft);
                doc.Orientation(PageOrientation.Portrait);
                doc.PageSize(PdfPageSize.A4);
                doc.DocumentMetadata(new DocumentMetadata { Author = "Vahid", Application = "PdfRpt", Keywords = "Test", Subject = "Test Rpt", Title = "Test" });
                doc.DiagonalWatermark(new DiagonalWatermark
                {
                    Text = "نمایش درصد پیشرفت",
                    RunDirection = PdfRunDirection.RightToLeft,
                    Font = getWatermarkFont()
                });
            })
            .DefaultFonts(fonts =>
            {
                fonts.Path(AppPath.ApplicationPath + "\\fonts\\irsans.ttf",
                                  Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf");
            })
            .PagesFooter(footer =>
            {
                footer.DefaultFooter(PersianDate.ToPersianDateTime(DateTime.Now, "/", true));
            })
            .PagesHeader(header =>
            {
                header.DefaultHeader(defaultHeader =>
                {
                    defaultHeader.Message("گزارش جدید ما");
                    defaultHeader.ImagePath(AppPath.ApplicationPath + "\\Images\\01.png");
                });
            })
            .MainTableTemplate(template =>
            {
                template.BasicTemplate(BasicTemplate.SilverTemplate);
            })
            .MainTablePreferences(table =>
            {
                table.ColumnsWidthsType(TableColumnWidthType.Relative);
                table.MultipleColumnsPerPage(new MultipleColumnsPerPage
                {
                    ColumnsGap = 20,
                    ColumnsPerPage = 2,
                    ColumnsWidth = 250,
                    IsRightToLeft = true,
                    TopMargin = 7
                });
            })
            .MainTableDataSource(dataSource =>
            {
                var listOfRows = new List<Task>();
                var rnd = new Random();
                for (int i = 0; i < 400; i++)
                {
                    listOfRows.Add(new Task
                    {
                        Id = rnd.Next(1000, 10000),
                        Name = "Task" + i,
                        PercentCompleted = rnd.Next(1, 100),
                        IsActive = rnd.Next(0, 2) == 1 ? true : false
                    });
                }
                dataSource.StronglyTypedList<Task>(listOfRows);
            })
            .MainTableColumns(columns =>
            {
                columns.AddColumn(column =>
                {
                    column.PropertyName("rowNo");
                    column.IsRowNumber(true);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(0);
                    column.Width(1);
                    column.HeaderCell("ردیف", captionRotation: 90);
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<Task>(x => x.Id);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(2);
                    column.HeaderCell("شماره فعالیت");
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<Task>(x => x.Name);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(2);
                    column.Width(3);
                    column.HeaderCell("فعالیت");
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<Task>(x => x.PercentCompleted);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(3);
                    column.Width(3);
                    column.HeaderCell("درصد پیشرفت");
                    column.ColumnItemsTemplate(template =>
                    {
                        template.ProgressBar(progressBarColor: Color.SkyBlue, showPercentText: true);
                        template.DisplayFormatFormula(obj =>
                        {
                            if (obj == null) return "% 0";
                            return "% " + obj.ToString();
                        });
                    });
                });

                columns.AddColumn(column =>
                {
                    column.PropertyName<Task>(x => x.IsActive);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(4);
                    column.Width(2);
                    column.HeaderCell("در جریان");
                    column.ColumnItemsTemplate(template =>
                    {
                        template.Checkmark(checkmarkFillColor: Color.Green, crossSignFillColor: Color.DarkRed);
                    });
                });
            })
            .MainTableEvents(events =>
            {
                events.DataSourceIsEmpty(message: "There is no data available to display.");
            })
            .Export(export =>
            {
                export.ToExcel();
            })
            .Generate(data => data.AsPdfFile(AppPath.ApplicationPath + "\\Pdf\\ProgressReportSample.pdf"));
        }
    }
}

توضیحات:

- همانطور که در کدهای فوق ملاحظه می‌کنید، برای تعریف یک watermark قطری در سراسر سند تولیدی، نیاز است در متد DocumentPreferences، تنظیمات DiagonalWatermark را مشخص کرد:
doc.DiagonalWatermark(new DiagonalWatermark
                {
                    Text = "نمایش درصد پیشرفت",
                    RunDirection = PdfRunDirection.RightToLeft,
                    Font = getWatermarkFont()
                });
در اینجا Text، متنی است که نمایش داده خواهد شد. تنظیم PdfRunDirection.RightToLeft برای نمایش صحیح متون فارسی الزامی است. همچنین این watermark نیاز به قلم مناسب و متفاوتی نسبت به قلم‌های پیش فرض گزارش نیز دارد:
        private IPdfFont getWatermarkFont()
        {
            var watermarkFont = new GenericFontProvider(
                                        AppPath.ApplicationPath + "\\fonts\\irsans.ttf",
                                        Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf");
            watermarkFont.Color = BaseColor.LIGHT_GRAY;
            watermarkFont.Size = 50;
            return watermarkFont;
        }
قلم‌هایی از جنس IPdfFont را توسط کلاس توکار GenericFontProvider به نحوی که ملاحظه می‌کنید می‌توان ایجاد کرد.

- برای ستون بندی گزارش باید به متد MainTablePreferences رجوع نمود. در اینجا می‌توان تنظیمات دقیق ستون‌های گزارش را مشخص کرد:
table.MultipleColumnsPerPage(new MultipleColumnsPerPage
                {
                    ColumnsGap = 20,
                    ColumnsPerPage = 2,
                    ColumnsWidth = 250,
                    IsRightToLeft = true,
                    TopMargin = 7
                });
برای مثال در اینجا 2 ستون در هر صفحه تعریف شده است (ColumnsPerPage). فاصله بین این ستون‌ها 20 است (ColumnsGap). عرض هر ستون 250 درنظر گرفته شده (ColumnsWidth) و همچنین توسط تنظیم IsRightToLeft، سبب خواهیم شد تا جداول از راست به چپ شروع و در صفحه نمایش داده شوند. (اگر به شماره ردیف‌ها در شکل ابتدای بحث دقت کنید، ردیف 1 در سمت راست صفحه قرار دارد).

- برای نمایش درصد پیشرفت در یک سلول خاص تنها کافی است قالب مخصوص آن‌را انتخاب و مقدار دهی کنیم:
                    column.ColumnItemsTemplate(template =>
                    {
                        template.ProgressBar(progressBarColor: Color.SkyBlue, showPercentText: true);
                        template.DisplayFormatFormula(obj =>
                        {
                            if (obj == null) return "% 0";
                            return "% " + obj.ToString();
                        });
                    });
قالب از پیش تعریف شده ProgressBar، مقدار سلول جاری را دریافت و آن‌را تبدیل به یک میله افقی درصد پیشرفت می‌کند. همچنین در اینجا توسط DisplayFormatFormula، یک علامت درصد هم به متنی که قرار است نمایش داده شود، اضافه کرده‌ایم.

- نمایش چک مارک و علامت ضربدر نیز به همین منوال است. باید قالب مناسبی را برای آن انتخاب و اعمال کرد:
                    column.ColumnItemsTemplate(template =>
                    {
                        template.Checkmark(checkmarkFillColor: Color.Green, crossSignFillColor: Color.DarkRed);
                    });
قالب Checkmark نیز جزو قالب‌های از پیش تعریف شده PdfReport است و بر اساس گرافیک برداری کار می‌کند.
پاسخ به بازخورد‌های پروژه‌ها
ایجاد گزارش با داده های ثابت و متغیر
زمانیکه listOfRows تشکیل شد، ساختار اولیه اطلاعات شما اهمیتی ندارد. مابقی آن مانند سایر گزارشات متداول است. برای مثال : « گروه بندی اطلاعات و گزارشات Master-Details در PdfReport »
در حالت شما به نظر می‌رسد که گروه بندی قرار است بر اساس کلمه اول عنوان صورت گیرد. بنابراین فقط کافی است بنویسید:
 columns.AddColumn(column =>
                {
                    column.PropertyName<Rpt>(x => x.Title);
                    column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                    column.IsVisible(true);
                    column.Order(1);
                    column.Width(2);
                    column.HeaderCell("Title");
    column.Group(true,
                       (val1, val2) =>
                       {
                          var parts1 = val1.ToString().Split(' ');
                          var parts2 = val2.ToString().Split(' ');
                          return parts1[0] == parts2[0];
                       });
                });
مستندات این کتابخانه را در سایت، در گروه PdfReport می‌توانید پیگیری کنید.
بازخوردهای پروژه‌ها
مشکل با نوشتن تابع تجمعی سفارشی(از طریق پیاده سازی IAggregateFunction)
با سلام؛ ضمن تشکر از اینکه تجربیاتتون رو رایگان در اختیار بقیه قرار می‌دید، به شخصه خیلی استفاده کردم.
سوالی داشتم در رابطه با پیاده سازی اینترفیس IAggregateFunction  
من میخوام یه گزارش بنویسم که تو اون ستون آخرش میخواد مانده تجمعی را حساب کنه.
بنابراین میخواستم با پیاده سازی این اینترفیس و همچنین بازنویسی متد ProcessingBoundary آخرین مقدار رو به عنوان خروجی تابع تجمعی ارسال کنم.
public object ProcessingBoundary(IList<SummaryCellData> columnCellsSummaryData)
        {
            if (columnCellsSummaryData == null || !columnCellsSummaryData.Any()) return 0;

            var list = columnCellsSummaryData;
            var lastItem = list.Last();

            return lastItem.CellData.PropertyValue;

        }
در پروژه‌ی دیگه ای این اینترفیس رو پیاده سازی کردم و مشکلی نبود ولی در پروژه جاری
که پروژه ایست با مشخصات:
نوع پروژه : WPF with MVVM
از Prism و Unity هم برای ماژولار شدن استفاده کردم.
خطای زیر رو میده : 
Method 'set_DisplayFormatFormula' in type 'Hezareh.Modules.Accounting.Reporting.ViewModels.MySampleAggregateFunction' from assembly 'Hezareh.Modules.Accounting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
در صورتی که اینترفیس IAggregateFunction به صورت کامل توسط کلاس  MySampleAggregateFunction پیاده سازی شده است و این هم کد کامل کلاس که همون کد مثال Sum خودتونه، که فقط تابع  ProcessingBoundary رو تغییر دادم. این هم کد کاملش :
 public class MySampleAggregateFunction : IAggregateFunction
    {
        public MySampleAggregateFunction()
        {

        }

        /// <summary>
        /// Fires before rendering of this cell.
        /// Now you have time to manipulate the received object and apply your custom formatting function.
        /// It can be null.
        /// </summary>
        public Func<object, string> DisplayFormatFormula { set; get; }

        #region Fields (6)

        double _groupAvg;
        long _groupRowNumber;
        double _groupSum;
        double _overallAvg;
        long _overallRowNumber;
        double _overallSum;

        #endregion Fields

        #region Properties (2)

        /// <summary>
        /// Returns current groups' aggregate value.
        /// </summary>
        public object GroupValue
        {
            get { return _groupAvg; }
        }

        /// <summary>
        /// Returns current row's aggregate value without considering the presence of the groups.
        /// </summary>
        public object OverallValue
        {
            get { return _overallAvg; }
        }

        #endregion Properties

        #region Methods (4)

        // Public Methods (1) 

        /// <summary>
        /// Fires after adding a cell to the main table.
        /// </summary>
        /// <param name="cellDataValue">Current cell's data</param>
        /// <param name="isNewGroupStarted">Indicated starting a new group</param>
        public void CellAdded(object cellDataValue, bool isNewGroupStarted)
        {
            checkNewGroupStarted(isNewGroupStarted);

            _overallRowNumber++;
            _groupRowNumber++;

            double cellValue;
            if (double.TryParse(cellDataValue.ToSafeString(), NumberStyles.AllowThousands | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out cellValue))
            {
                groupAvg(cellValue);
                overallAvg(cellValue);
            }
        }
        // Private Methods (3) 

        private void checkNewGroupStarted(bool newGroupStarted)
        {
            if (newGroupStarted)
            {
                _groupRowNumber = 0;
                _groupAvg = 0;
                _groupSum = 0;
            }
        }

        private void groupAvg(double cellValue)
        {
            _groupSum += cellValue;
            _groupAvg = _groupSum / _groupRowNumber;
        }

        private void overallAvg(double cellValue)
        {
            _overallSum += cellValue;
            _overallAvg = _overallSum / _overallRowNumber;
        }

        /// <summary>
        /// A general method which takes a list of data and calculates its corresponding aggregate value.
        /// It will be used to calculate the aggregate value of each pages individually, with considering the previous pages data.
        /// </summary>
        /// <param name="columnCellsSummaryData">List of data</param>
        /// <returns>Aggregate value</returns>
        public object ProcessingBoundary(IList<SummaryCellData> columnCellsSummaryData)
        {
            if (columnCellsSummaryData == null || !columnCellsSummaryData.Any()) return 0;

            var list = columnCellsSummaryData;
            var lastItem = list.Last();

            return lastItem.CellData.PropertyValue;

        }
        #endregion Methods

    }
و همچنین این هم تنظیمات ستونی که از این تابع تجمعی میخوام استفاده کنم.
columns.AddColumn(column =>
                {
                    column.PropertyName<VoucherRowPrintViewModel>(x => x.CaclulatedRemains);
                    column.CellsHorizontalAlignment(PdfRpt.Core.Contracts.HorizontalAlignment.Right);
                    column.IsVisible(true);
                    column.Order(5);
                    column.Width(1.5f);
                    column.ColumnItemsTemplate(template =>
                    {
                        template.TextBlock();
                        template.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj));
                    });
                    column.AggregateFunction(aggregateFunction =>
                    {
                        aggregateFunction.CustomAggregateFunction(new MySampleAggregateFunction());
                        aggregateFunction.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj));
                    });
                    column.HeaderCell("مانده");
                });
ممنون میشم در صورت امکان کمکم کنید.
بازخوردهای پروژه‌ها
عدم اعمال style در ستون های سفارشی
با سلام
در گزارش من استایل اعمال نمیشود. تنظیمات ابتدایی:
_pdfReport.MainTablePreferences((table) => {
table.ColumnsWidthsType(TableColumnWidthType.Relative);
});
تنظیمات ستون‌ها :
_columns.AddColumn((column) => {
column.PropertyName("col2");
column.CellsHorizontalAlignment(HorizontalAlignment.Center);
column.IsVisible(true);
 column.Order(5);
column.Width(3);
column.HeaderCell("   از    |   تا   ");
column.ColumnItemsTemplate((itemsTemplate) => itemsTemplate.Html());
 column.CalculatedField((list) => {
var FromDate = list.GetSafeStringValueOf<PersonnelTraining>((x) => x.FromDate);
var ToDate = list.GetSafeStringValueOf<PersonnelTraining>((x) => x.ToDate);
return "<table style='width: 100px;'><tr><td style='border-right:1px solid #000;'>" + FromDate + "</td><td>" + ToDate + "</td></tr></table>";
 });
در جدول و ستون‌ها استایلی اعمال نمیشود. در نهایت هدف ایجاد چنین ستونی میباشد.