Reputation: 3197
I am currently trying to work out web based report designer. The issue I am facing at the moment is that I am not able to see the filed of the bound data source in the designer. Following is my code
DataSet ds = new DataSet();
ds.DataSetName = "Data Set";
ds.Tables.Add(dataTable);
var report = new XtraReport();
report.DataSource = ds;
report.DataMember = ds.Tables[0].TableName;// "ExcelParser Data"
ASPxReportDesigner1.OpenReport(report);
Where as the dataTable is populated using an excel sheet so it contains columns and rows. Even if i create a stub datatable, its fields wont show up in the report designer.
I have also tried by writing an .XSD file on drive from dataset and mentioned the file path as DataSoruceSchema parameter. Still no use.
There isnt much help available on DevExpress portal either w.r.t ASP.NET report designer.
Upvotes: 3
Views: 2966
Reputation: 3197
Finally I got it working with the help of DevEx support. It seems that a custom dataset serializer is required for dataset that are created on run time to work. Here is the updated code now
XtraReport report = new XtraReport();
report.Extensions[SerializationService.Guid] = MyDataSerializer.Name;
report.DataSource = MyDataSerializer.GenerateActorMembers();
report.DataMember = "Actor Members";
ASPxReportDesigner1.OpenReport(report);
And here is the updated custom serializer for my data
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 == "Members";
}
public object Deserialize(string value, string typeName, object extensionProvider) {
if(value == "Members") {
return GenerateActorMembers();
}
return null;
}
public static DataSet GenerateActorMembers() {
var dt = new DataTable();
dt.TableName = "Actor Members";
dt.Columns.Add("MemberId");
dt.Columns.Add("MemberName");
dt.Columns.Add("MemberDOB");
dt.Columns.Add("MemberAddress");
dt.Rows.Add(dt.NewRow());// Rows.Add(new DataRow());
dt.Rows[0]["MemberId"] = "1";
dt.Rows[0]["MemberName"] = "George Clooney";
dt.Rows[0]["MemberDOB"] = "1960/01/02";
dt.Rows[0]["MemberAddress"] = "NY, NY, USA";
dt.Rows.Add(dt.NewRow());
dt.Rows[1]["MemberId"] = "2";
dt.Rows[1]["MemberName"] = "Reober Deniro";
dt.Rows[1]["MemberDOB"] = "1958/01/02";
dt.Rows[1]["MemberAddress"] = "NY, NY, USA";
dt.Rows.Add(dt.NewRow());
dt.Rows[2]["MemberId"] = "3";
dt.Rows[2]["MemberName"] = "Clive Owen";
dt.Rows[2]["MemberDOB"] = "1965/01/02";
dt.Rows[2]["MemberAddress"] = "London, London, UK";
dt.Rows.Add(dt.NewRow());
dt.Rows[3]["MemberId"] = "4";
dt.Rows[3]["MemberName"] = "Clive Owen";
dt.Rows[3]["MemberDOB"] = "1965/01/02";
dt.Rows[3]["MemberAddress"] = "London, London, UK";
var ds = new DataSet();
ds.Tables.Add(dt);
ds.DataSetName = "Members";
return ds;
}
}
And you will need to register the serializer in Application_Start in Global.asax
SerializationService.RegisterSerializer(MyDataSerializer.Name, new MyDataSerializer());
Here is the solution and DevEx explanation with code Field List in ASPxReportDesigner is not showing
But I am still trying to figure it out how to work with datasets that are populated dynamically from database. Issue is that I wont know the number and names of tables in that case. Still working on it...
Upvotes: 5