Devexpress ile Report Designer kullanımı

Murat Süzen
Sep 20, 2016 · 2 min read

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 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.

Murat Süzen

Written by

Main blog is muratsuzen.com

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade