Note that there are some explanatory texts on larger screens.

plurals
  1. POHow can a base class with abstract methods be used to handle delegate calls?
    primarykey
    data
    text
    <p>Here is the base class:</p> <pre><code>using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Reporting.WinForms; abstract class ReportWinForm : System.Windows.Forms.Form { // This will be the one line of code needed in each WinForm--providing the base class a reference // to the report, so it has access to the SubreportProcessing event protected ReportViewer WinFormReportViewer { get; set; } // Making this abstract requires each derived WinForm to implement GetReportData--foolproof! protected abstract DataResult GetReportData(SubreportProcessingEventArgs e); // Wire up the subreport_processing handler when any WinForm loads // You could override this in derived WinForms classes if you need different behavior for some WinForms, // but I would bet this default behavior will serve well in most or all cases protected virtual void Form1_Load(object sender, EventArgs e) { WinFormReportViewer.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing); } // When the Subreport processing event fires, handle it here // You could also override this method in a derived class if need be protected virtual void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) { // Get the data needed for the subreport DataResult dataResult = this.GetReportData(e); e.DataSources.Clear(); e.DataSources.Add(new ReportDataSource(dataResult.Label, dataResult.Table)); } } </code></pre> <p>Here is the concrete implementation:</p> <pre><code>public frmTestAllView() { //base.WinFormReportViewer = reportViewer1; //Hook-up callbacks to the base class ReportWinForm InitializeComponent(); } private void frmTestAllView_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'AFC_ObsolescenceDataSet.up_Fill_frmInternalCaseStatus_All' table. You can move, or remove it, as needed. this.up_Fill_frmInternalCaseStatus_AllTableAdapter.Fill(this.AFC_ObsolescenceDataSet.up_Fill_frmInternalCaseStatus_All); this.reportViewer1.RefreshReport(); } // The search parameters will be different for every winform, and will presumably // come from some winform UI elements on that form, e.g., parentPartTextBox.Text protected override DataResult GetReportData(SubreportProcessingEventArgs e) { // Return the data result, which contains a data table and a label which will be // passed to the report data source // You could use DataSet in DataResult instead of DataTable if needed switch (e.ReportPath) { case "rptSubAlternateParts": return new DataResult( new BLL.AlternatePartBLL().GetAlternativePart(parentPartTextBox.Text) , "BLL_AlternatePartBLL" ); case "rptSubGetAssemblies": return new DataResult( new BLL.SubAssemblyBLL().GetSubAssemblies(someOtherTextBox.Text) , "BLL_SubAssemblyBLL" ); default: throw new NotImplementedException(string.Format("Subreport {0} is not implemented", e.ReportPath)); } } </code></pre> <p>There are two problems:</p> <ol> <li><code>DataResult</code> is unrecognized by Visual Studio 2008, even though it is in the ReportWinForm base class.</li> <li>The designer in VS 2008 claims that a class derived from ReportWinForm cannot be edited, even though the base class is descends from <code>Form</code>.</li> </ol> <p>For more context, please see <a href="https://stackoverflow.com/questions/14777799/how-can-a-delegate-respond-to-multiple-events-with-a-generic-and-extensible-clas">How can a delegate respond to multiple events with a generic and extensible class?</a></p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload