فرض کنید اطلاعات حضور و غیاب کارمندان را به نحو زیر در اختیار دارید:
namespace PdfReportSamples.Models { public class UserWorkedHours { public int Id { set; get; } public string Name { set; get; } public int DayNumber { set; get; } public int Month { set; get; } public int Year { set; get; } public string Description { set; get; } } }
private static List<UserWorkedHours> createUsersWorkedHours() { var usersWorkedHours = new List<UserWorkedHours>(); for (int i = 1; i < 11; i++) { for (int j = 1; j < 28; j++) { usersWorkedHours.Add(new UserWorkedHours { Id = i, Name = "کارمند " + i, Year = 1391, // سال و ماه بر اساس نوع تقویم انتخابی مشخص میشود Month = i, DayNumber = j, Description = i % 2 == 0 ? "05:00" : "08:00" }); } } return usersWorkedHours; }
سلولی که قرار است قالب MonthCalendar را نمایش دهد نیاز به شیءایی از نوع PdfRpt.Calendar.CalendarData دارد که به نحو زیر تعریف شده است:
using System.Collections.Generic; namespace PdfRpt.Calendar { public class CalendarData { public int Month { set; get; } public int Year { set; get; } public IList<DayInfo> MonthDaysInfo { set; get; } } }
namespace PdfRpt.Calendar { public class DayInfo { public int DayNumber { set; get; } public int Month { set; get; } public int Year { set; get; } public string Description { set; get; } public bool ShowDescriptionInFooter { set; get; } } }
اکنون نیاز است تا اطلاعات منبع داده خود را به CalendarData نگاشت کنیم تا بتوان از آن در قالب سلول جدید MonthCalendar استفاده کرد. انجام اینکار با استفاده از امکانات LINQ به نحو زیر است:
public static IList<UserMonthCalendar> CreateDataSource() { var usersWorkedHours = createUsersWorkedHours(); // Mapping a list of normal Users WorkedHours to a list of Users + CalendarData return usersWorkedHours .GroupBy(x => new { Id = x.Id, Name = x.Name }) .Select( x => new UserMonthCalendar { Id = x.Key.Id, Name = x.Key.Name, // Calendar's cell data type should be PdfRpt.Calendar.CalendarData MonthCalendarData = new CalendarData { Year = x.First().Year, Month = x.First().Month, MonthDaysInfo = x.ToList().Select(y => new DayInfo { Description = y.Description, ShowDescriptionInFooter = false, DayNumber = y.DayNumber }).ToList() } }).ToList(); }
using PdfRpt.Calendar; namespace PdfReportSamples.Models { public class UserMonthCalendar { public int Id { set; get; } public string Name { set; get; } // Calendar's cell data type should be CalendarData public CalendarData MonthCalendarData { set; get; } } }
برای نمایش این اطلاعات توسط PdfReport، دو ستون اول یاد شده نکته خاصی ندارند، اما نحوه تعریف ستون تقویم ماهیانه آن به صورت زیر خواهد بود:
columns.AddColumn(column => { // Calendar's cell data type should be PdfRpt.Calendar.CalendarData column.PropertyName<UserMonthCalendar>(x => x.MonthCalendarData); column.CellsHorizontalAlignment(HorizontalAlignment.Center); column.IsVisible(true); column.Order(3); column.Width(3); column.HeaderCell("تقویم ماهیانه"); column.ColumnItemsTemplate(itemsTemplate => { itemsTemplate.MonthCalendar(new CalendarAttributes { CalendarType = CalendarType.PersianCalendar, UseLongDayNamesOfWeek = true, Padding = 3, DescriptionHorizontalAlignment = HorizontalAlignment.Center, SplitRows = true, CellsCustomizer = info => { if (info.Year == 1391 && info.Month == 1 && info.DayNumber == 1) { info.NumberCell.BackgroundColor = new BaseColor(System.Drawing.Color.LimeGreen); var phrase = info.NumberCell.Phrase; foreach (var chunk in phrase.Chunks) chunk.Font.Color = new BaseColor(System.Drawing.Color.Yellow); } } }); }); });