Demystifying DevExpress XtraReport for Silverlight - Part 3

<< part 2 part 4 >>


Below are code snippets used in putting it all together. The first snippet is the event handler for DATASOURCE DEMANDED. Here you can change the datasouce for the report and also filter or do any other house cleaning for the report's datasource.

The second snippet is the event handler for the BEFOREPRINT event for the subreprot control. This is actually the best place to bind the datasource for the subreport's report. If you use the DATASOURCE DEMANDED for the subreport - you are likely to get duplicate data printed.

The last two snippets of code are just generic routines that can be used to propagate automatically all the parameter values for the master into the details and as well as assign new parameter values.

Another good thing to bear in mind are these Report Class methods -

  • GetCurrentRow - which returns an object implementing the System.Collections.IList interface the return value will be an item from the collection represented by this object.
  • GetCurrentValue - which returns an object which represents the current value of the specified column in the data source. If the specified column was not found, this method returns null.
  • private void BasetReportWithHeading_DataSourceDemanded(object sender, EventArgs e)
    {
      // Extract and Process any properties set from the base class ( subclass)
      LocalProceeParameterValues();
      // Extract and Process and Param values passed when invoking the report
      ProceeParameterValues();
      // Specify the bindings for controls in the detail Band
      BindControlsToDataSource();        
      // specify the bindings for controls in the Group Band
      BindGroupHeadingsFields();
      // Get the Dataset  for the Report's datasource
      MainDatasource.DataSource = GetMainBDSDataSource();
      // Get other Datasources
      OtherDatasSourceDemanded();
    }
    
    private void xrSubreport_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
    {
      PropagateParamValues(this, (XRSubreport)sender);
      SetSubReporParamValue((XRSubreport)sender, "paramId", GetCurrentColumnValue("ID"),     \
                                            Type.GetType("string"));
      SetSubReporParamValue((XRSubreport)sender, "paramame", GetCurrentColumnValue
                                          ("NAME"),Type.GetType("string"));
      if (GetCurrentColumnValue("ID") != null)
      {
         ((DetailGroup)((XRSubreport)sender).ReportSource).DataSource =                 
              GetSubReportDataSourceThreadSafe();
      }
    }
    
    public void PropagateParamValues(XtraReport ParentReport, XRSubreport SubReport)
    {
      if (ParentReport != null && SubReport != null && SubReport.ReportSource != null)
      {
        foreach (DevExpress.XtraReports.Parameters.Parameter vParam in ParentReport.Parameters)
        {
          SetSubReporParamValue(SubReport, vParam.Name, vParam.Value, vParam.Type);
         }
       }
    }
    
    public void SetSubReporParamValue(XRSubreport SubReport, string ParamName, Object ParamValue,Type ParamTYpe  )
     {
       if (SubReport != null && SubReport.ReportSource != null && ParamValue != null)
       {
         if (((XtraReport)SubReport.ReportSource).Parameters[ParamName] != null)
         {
           ((XtraReport)SubReport.ReportSource).Parameters[ParamName].Value = ParamValue;
          }
          else
          {
            ((XtraReport)SubReport.ReportSource).Parameters.Add(new     
                  DevExpress.XtraReports.Parameters.Parameter{
                               Name=ParamName,   
                               Visible=false,
                               Value=ParamValue,
                               Type = ParamTYpe});
          }
      }
    }
    


    << part 2 part 4 >>

    Comments

    Popular posts from this blog

    Decompiling Delphi - 3

    Decompiling Delphi - 2

    Artificial Intelligence, Oxymoron and Natural Intelligence