在 class 中使用报告名称作为参数

Using Report Name as parameter in class

我是 C# 的新手,但我正在尝试创建 class 来加载所有报告并为其传递报告名称

public void ReportQuery(string DTTable,string query, ReportClass RPTT )
{
    using (IDbConnection db = new SqlConnection(constring))
    {               
        db.Open();
        da = new SqlDataAdapter(query, con);
        da.Fill(ds, DTTable);

        RPTT rpt= new RPTT();                    
        rpt.Load("~/RPTSales.rpt");
        rpt.SetDataSource(ds.Tables[DTTable]);
        this.crystalReportViewer1.ReportSource = rpt;
    }
}

我在 RPTT rpt= new RPTT() 上遇到错误;

'RPTT' is a variable but is used like a type

如何将报告名称作为参数传递?

编辑: 这是我尝试为其创建 class 的原始代码,因为我正在使用它加载大量报告:

 using (IDbConnection db = new SqlConnection(constring))
        {
            if (ds.Tables["RPTSales"] != null)
            {ds.Tables["RPTSales"].Clear();}                
                db.Open();
                da = new SqlDataAdapter("select * from sales", con);
                da.Fill(ds, "RPTSales");
                Reports.RPTSales rpt = new Reports.RPTSales();
                rpt.Load("~/RPTSales.rpt");
                rpt.SetDataSource(ds.Tables["RPTSales"]);
                SetDBLogonForReport(cn, rpt);
                this.crystalReportViewer1.ReportSource = rpt;                
        }

编辑 class 代码后,当我尝试调用它时:

 ReportQuery("RPTSales", "select * from sales",Reports.RPTSales );

我得到关于 Reports.RPTSales

的错误
Error   'RPTSales' is a type, which is not valid in the given context   

您的 RPTT 已经是 class 的实例。您正在尝试使用 class 的实例,就好像它是 class 本身一样。而不是尝试做

RPTT rpt= new RPTT();

只需使用 RPTT 参数即可。

public void ReportQuery(string DTTable,string query, ReportClass RPTT )
{
    using (IDbConnection db = new SqlConnection(constring))
    {               
        db.Open();
        da = new SqlDataAdapter(query, con);
        da.Fill(ds, DTTable);

        RPTT.Load("~/RPTSales.rpt");
        RPTT.SetDataSource(ds.Tables[DTTable]);
        this.crystalReportViewer1.ReportSource = RPTT;
    }

你原来的 post 几乎没有关于它的用法的上下文,你说 RRPT 是报告 "name",但我假设你的意思是它是子类?

在那种情况下,使用模板:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods

像这样(未经测试):

public void ReportQuery<T>(string DTTable,string query) where T : ReportClass
    {
        using (IDbConnection db = new SqlConnection(constring))
        {               
                db.Open();
                da = new SqlDataAdapter(query, con);
                da.Fill(ds, DTTable);

                T rpt= new T(); // Or just `T rpt = T()` if error here
                rpt.Load("~/RPTSales.rpt");
                rpt.SetDataSource(ds.Tables[DTTable]);
                this.crystalReportViewer1.ReportSource = rpt;
        }

原文中的上下文很少 post,但这似乎能回答您的实际问题吗?

在原始代码中 Reports.RPTSales 是一个类型,因此您可以创建一个实例作为方法的参数。

ReportQuery("RPTSales", "select * from sales",new Reports.RPTSales());

ReportQuery方法中你可以使用rpt对象来做数据绑定。

public void ReportQuery(string DTTable,string query, Reports.RPTSales rpt)
{
    using (IDbConnection db = new SqlConnection(constring))
    {               
        db.Open();
        da = new SqlDataAdapter(query, con);
        da.Fill(ds, DTTable);                  
        rpt.Load("~/RPTSales.rpt");
        rpt.SetDataSource(ds.Tables[DTTable]);
        this.crystalReportViewer1.ReportSource = rpt;
    }
}