2013-02-14 92 views
1

這是基礎類:如何使用抽象方法來處理委託調用?

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)); 
    } 
} 

下面是具體的實現:

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)); 

    } 
} 

有兩個問題:

  1. DataResult由Visual Studio 2008中無法識別,即使它在ReportWinForm基類中。
  2. 在VS設計者2008要求來自ReportWinForm派生的類不能被編輯,即使該基類是從Form下降。

更多情況下,請參閱How can a delegate respond to multiple events with a generic and extensible class?

+1

我沒有看到你定義「在ReportWinForm基類」一'DataResult'類。你必須提供關於設計者告訴你什麼的更多細節,還有各種各樣的理由不能編輯一個基於Form的類。 – 2013-02-14 18:27:25

+0

此外,還有「DataResult」的許多用途,請其使用VS是具有一個問題,確切的錯誤消息(多個)的細節。 – 2013-02-14 18:28:20

+0

此外,在什麼都在你的標題描述你是否對「代表」的問題呢? – 2013-02-14 18:29:12

回答

1

DataResult由Visual Studio 2008中無法識別,即使是在ReportWinForm基類。

如果真的是類,類外,應指定ReportWinForm.DataResult

VS 2008中的設計者聲稱從ReportWinForm派生的類無法編輯,即使基類是從Form下降的。

你確定你擁有所有DLL依賴正確的?您需要所有定義了所有基類的DLL。

順便說一句,你可以免費download Visual Studio 2012 Express edition,如果你可以並想升級。