In my previous post, we saw how report parameters and the FilterString editor had improved support for enum types. Let’s complicate matters a bit more by changing one of the enums to an actual class:
1: public enum Gender
2: {
3: Male,
4: Female
5: }
6:
7: public class PayGrade : XPObject
8: {
9: public decimal High { get; set; }
10: public decimal Low { get; set; }
11: public string Name { get; set; }
12: }
13:
14: public class Person : XPObject
15: {
16: public string Name { get; set; }
17: public DateTime BirthDate { get; set; }
18: public Gender Gender { get; set; }
19: public PayGrade Pay { get; set; }
20: }
Building on the ReportDesignExtension introduced, we can now support complex types in report parameters:

The FilterString Editor was not left out:

All of the previous steps required to support enums should be followed in order to support complex types. The only change is how we override the ReportDesignExtension:
1: public class PersonReportExtension : ReportDesignExtension
2: {
3: XPCollection<PayGrade> payGrades = new XPCollection<PayGrade>();
4:
5: public PersonReportExtension()
6: {
7:
8: }
9:
10: public override Type[] GetEditableDataTypes()
11: {
12: return new Type[] { typeof(PayGrade) };
13: }
14:
15: // repository item to show in params/filterstring
16: private RepositoryItem CreateRepositoryItem()
17: {
18: RepositoryItemLookUpEdit item = new RepositoryItemLookUpEdit();
19: item.NullText = "[Select Pay Grade]";
20: item.DataSource = payGrades;
21: item.DisplayMember = "Name";
22: item.ValueMember = "Oid";
23:
24: item.Columns.Add(new LookUpColumnInfo("Name"));
25:
26: item.Columns.Add(new LookUpColumnInfo("Low", "Low", 40,
27: FormatType.Numeric, "c", true, HorzAlignment.Near));
28:
29: item.Columns.Add(new LookUpColumnInfo("High", "High", 40,
30: FormatType.Numeric, "c", true, HorzAlignment.Near));
31:
32: return item;
33: }
34:
35: protected override RepositoryItem CreateRepositoryItem(DataColumnInfo dataColumnInfo,
36: Type dataType, XtraReport report)
37: {
38: return CreateRepositoryItem();
39: }
40:
41: protected override RepositoryItem CreateRepositoryItem(Parameter parameter,
42: Type dataType, XtraReport report)
43: {
44: return CreateRepositoryItem();
45: }
46:
47: public override void AddParameterTypes(IDictionary<Type, string> dictionary)
48: {
49: base.AddParameterTypes(dictionary);
50: dictionary.Add(typeof(Gender), "Person's Gender");
51: dictionary.Add(typeof(PayGrade), "Person's Pay");
52: }
53:
54: public override Type[] GetSerializableDataTypes()
55: {
56: return new Type[] { typeof(PayGrade) };
57: }
58:
59: // when serializing report params/filterstring data
60: protected override string SerializeData(object data, XtraReport report)
61: {
62: return ((XPObject)data).Oid.ToString();
63: }
64:
65: // for deserializing report params/filterstring data
66: protected override object DeserializeData(string value, Type destType, XtraReport report)
67: {
68: return payGrades.Session.GetObjectByKey(destType, Convert.ToInt32(value));
69: }
70: }
While this kind of extensibility was previously possible, this solution is much more elegant and robust.
As always, if there are any questions and/or comments feel free to get a hold
Seth Juarez
Email: sethj@devexpress.com
Twitter: @SethJuarez
Free DevExpress Products – Get Your Copy Today
The following free DevExpress product offers remain available. Should you have any questions about the free offers below, please submit a ticket via the
DevExpress Support Center at your convenience. We’ll be happy to follow-up.