Improved support for Complex Type Parameters and FilterString (coming in v2010 vol 2)
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 Gender2: {3: Male,4: Female5: }6:7: public class PayGrade : XPObject8: {9: public decimal High { get; set; }10: public decimal Low { get; set; }11: public string Name { get; set; }12: }13:14: public class Person : XPObject15: {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 : ReportDesignExtension2: {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