Devexpress ile Report Designer kullanımı

Devexpress componentleri arasında bulunan ReportDesigner componenti ile raport tasarımları oluşturabilirsiniz. Bu makalede dışarıdan DataSet yükleyerek bir raporu runtime dizayn nasıl yapılabilir olduğunu inceleyeceğim. ReportDesigner ile bir raporu oluşturmak için New Item => Reporting => Devexpress Report Wizard ile bir rapor oluşturup bunun üzerinden işlem yaptım. Ben runtime da rapor tasarmak istediğim için bu şekilde bir base rapor oluşturdum. Tabiki siz raporunuzu wizard ile de oluşturabilirsiniz. Rapor görüntüleme sayfasından dizayn sayfasına rapor ismini url üzerinden parametre olarak alıyorum. Bu şekilde daha önceden eklenmiş bir .repx şablon dosyası varsa onun üzerinde değişiklik yapıyorum yada yeni bir rapor tasarım sayfası açılmış oluyor.

protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
{

if (reportName != null && reportName.Length != 0)
{
tmpSingleReport = RLib.GetReportList().FirstOrDefault(x => x.PageID == Convert.ToInt32(rPageId) && x.RName.ToUpper() == reportName.ToUpper());
rpDesigner.OpenReport(Server.MapPath(@"XReportSource\" + tmpSingleReport.FileName));
}
else
{
GetData();
}
                if(rReturnPage!=null)
returnUrl.Value = rReturnPage.ToString();
}
}

Eğer url ile aldığım repottName null değere sahipse GetData metodumu çağırıyorum. Bu metod ise yeni boş fakat Dizayn sayfasına gönderen görüntüleme sayfasında doldurduğum DataSet i bu yeni boş raporun datasource na yüklenmiş halde oluşturuluyor.

void GetData()
{
XtraReport report = new XtraReport();
report.Extensions[SerializationService.Guid] = MyDataSerializer.Name;
report.DataSource = MyDataSerializer.GenerateActorMembers();
report.DataMember = dtName;
rpDesigner.OpenReport(report);
}

Aşağıdaki gibi MyDataSerializer classı güncel güncel dataseti ve tabloları kendisine set ederek bize geri döndürüyor.

public class MyDataSerializer : IDataSerializer
{
public const string Name = "MyDataSerializer";

public bool CanSerialize(object data, object extensionProvider)
{
return data is DataSet;
}
        public string Serialize(object data, object extensionProvider)
{
var ds = (DataSet)data;
return ds.DataSetName;
}
        public bool CanDeserialize(string value, string typeName, object extensionProvider)
{
return value == "SCMDataSet";
}
        public object Deserialize(string value, string typeName, object extensionProvider)
{
if (value == "SCMDataSet")
{
return GenerateActorMembers();
}
return null;
}
        public static DataSet GenerateActorMembers()
{
DataSet ds = new DataSet();
            if(DataClass.dsList!=null)
ds = DataClass.dsList;
            ds.DataSetName = "SCMDataSet";
return ds;
}
}

Yüklenmiş olan DataSet li raporumuzdaki tasarım işlemlerimiz bittiğinde bu raporu .repx formatında rapor şablonu olarak kayıt ediyoruz. Kayıt işlemi için ise ReportDesigner in onsavereportlayout eventinden yararlanmalıyız. Bu eventi custom save butonlarımızda tetiklemel istediğimizde rpDesigner.PerformCallback(parameters); metodunu javascript ile tetiklemeliyiz.

protected void rpDesigner_save(object sender,SaveReportLayoutEventArgs e)
{
try
{
string filename = string.Empty;
filename = Guid.NewGuid().ToString();
string reportName = HttpUtility.UrlDecode(e.Parameters);
var singleReport = tmpReportList.FirstOrDefault(x => x.RName.ToUpper() == reportName.ToUpper());
filename = (singleReport != null) ? singleReport.FileName : filename + ".repx";
SaveReport(filename, e.ReportLayout);
RLib.CreateReport((int)Enums.ReportType.DokumanRapor, Convert.ToInt32(rPageId), reportName, filename, SessionUser.Current);
GetLoadReport();
GetReportList();
GetComboLoadReport();
}
catch (Exception ex)
{

}
}
        protected void SaveReport(string fileName, byte[] reportLayout)
{
File.WriteAllBytes(Server.MapPath(@"XReportSource\" + fileName), reportLayout);
}

SaveReportLayoutEventArgs eventinde e.parameters ile rapor ismini ve rapor layout una erişebiliriz.Bu şekilde rapor tasarımımızı kaydetmiş oluruz.