Improved support for Complex Type Parameters and FilterString (coming in v2010 vol 2)

DevExpress Data Blog
19 October 2010

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:

ParamsComplex

The FilterString Editor was not left out:

FilterStringComplex

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

Please login or register to post comments.