使用Report Name作为类中的参数

时间:2018-02-07 01:10:58

标签: c# crystal-reports

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

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'是一个变量,但用作类型

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

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

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

编辑类代码后,我尝试调用它:

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

我收到有关Reports.RPTSales

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

3 个答案:

答案 0 :(得分:2)

您的RPTT已经是该课程的一个实例。您正在尝试使用该类的实例,就好像它本身就是一个类。而不是试图做

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

答案 1 :(得分:1)

您的原始帖子几乎没有关于其用法的上下文,您说RRPT是报告“名称”,但我认为您的意思是它是子类?

在这种情况下,请使用模板: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;
        }

原始帖子中的上下文很少,但这似乎可以回答您的实际问题吗?

答案 2 :(得分:1)

原始代码START TRANSACTION; // Your truncate statements; COMMIT; 是一个Type,因此您可以创建一个实例作为方法的参数。

Reports.RPTSales

ReportQuery("RPTSales", "select * from sales",new Reports.RPTSales()); 方法中,您可以使用ReportQuery对象进行数据数据绑定。

rpt