如何使用具有抽象方法的基类来处理委托调用? [英] How can a base class with abstract methods be used to handle delegate calls?

查看:33
本文介绍了如何使用具有抽象方法的基类来处理委托调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是基类:

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 派生的.
  1. DataResult is unrecognized by Visual Studio 2008, even though it is in the ReportWinForm base class.
  2. The designer in VS 2008 claims that a class derived from ReportWinForm cannot be edited, even though the base class is descends from Form.

有关更多上下文,请参阅委托如何使用通用和可扩展的类响应多个事件?

For more context, please see How can a delegate respond to multiple events with a generic and extensible class?

推荐答案

Visual Studio 2008 无法识别 DataResult,即使它在 ReportWinForm 基类中.

DataResult is unrecognized by Visual Studio 2008, even though it is in the ReportWinForm base class.

如果它确实类中,则应在类外指定ReportWinForm.DataResult.

If it is really in the class, outside of the class you should specify ReportWinForm.DataResult.

VS 2008 中的设计器声称不能编辑从 ReportWinForm 派生的类,即使基类是从 Form 派生的.

The designer in VS 2008 claims that a class derived from ReportWinForm cannot be edited, even though the base class is descends from Form.

您确定所有 DLL 依赖项都正确吗?您需要定义了所有基类的所有 DLL.

Are you sure you have all DLL dependencies correct? You need all DLLs in which all base classes are defined.

顺便说一下,你可以下载Visual Studio2012 Express 版免费,如果您可以并且想要升级.

By the way, you can download Visual Studio 2012 Express edition for free, if you can and want to upgrade.

这篇关于如何使用具有抽象方法的基类来处理委托调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆