Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Vb.Net从字符串获取报告名称_String_Vb.net_Class_Crystal Reports - Fatal编程技术网

String Vb.Net从字符串获取报告名称

String Vb.Net从字符串获取报告名称,string,vb.net,class,crystal-reports,String,Vb.net,Class,Crystal Reports,我的项目中有不同的Crystal报告,如: RptHbl RptUBL RptMCB RptBAF 等等 现在我有一个字符串,其中一个是从数据库中获取的报告名 比如: Dim Myrptname=“RptHbl” 现在我想加载一个报告,我通常使用下面的代码初始化该报告 Dim Myrpt作为新的RptHbl 现在,我如何使用存储在字符串Myrptname中的报表名称 喜欢 将Myrpt变暗为新的“MyrptName”??????? 谢谢首先,您需要报表类的全名,因此如果数据库中的名称只是类名,则

我的项目中有不同的Crystal报告,如:

RptHbl RptUBL RptMCB RptBAF

等等

现在我有一个字符串,其中一个是从数据库中获取的报告名 比如:

Dim Myrptname=“RptHbl”

现在我想加载一个报告,我通常使用下面的代码初始化该报告

Dim Myrpt作为新的RptHbl

现在,我如何使用存储在字符串Myrptname中的报表名称 喜欢 将Myrpt变暗为新的“MyrptName”???????
谢谢

首先,您需要报表类的全名,因此如果数据库中的名称只是类名,则需要附加名称空间:

Dim reportName As String = "RptHbl"
Dim fullTypeName As String = "MyNamespace." & reportName ' Consider using the NameOf operator
接下来,您可以使用
Assembly.GetType
,它使用反射按全名查找类型(即类)。但是,首先需要获得对正确程序集的引用。如果您的报表位于同一程序集中,则可以按如下方式执行:

Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim reportAssembly As Assembly = GetType(RptHbl).Assembly
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim report As Object = Activator.CreateInstance(reportType) 
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
但是,如果报告位于不同的程序集中,则只要有对其中一个报告的引用,就可以这样做:

Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim reportAssembly As Assembly = GetType(RptHbl).Assembly
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim report As Object = Activator.CreateInstance(reportType) 
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
拥有描述报表类的
Type
对象后,可以使用
Activator.CreateInstance
方法创建其实例,如下所示:

Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim reportAssembly As Assembly = GetType(RptHbl).Assembly
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim report As Object = Activator.CreateInstance(reportType) 
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
我对Crystal报表的了解还不够,但我假设所有报表类都是从某个基类派生的。为了举例,我们假设它们都继承自一个名为
Report
的基类。如果是,则可以将新实例强制转换为该基本类型,如下所示:

Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim reportAssembly As Assembly = GetType(RptHbl).Assembly
Dim reportType As Type = reportAssembly.GetType(fullTypeName)
Dim report As Object = Activator.CreateInstance(reportType) 
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
所以,把所有这些放在一起,你可以按照以下思路做一些事情:

Function CreateReport(name As String) As Report
    Dim reportTypeName As String = "MyNamespace." & name
    Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
    Dim reportType As Type = reportAssembly.GetType(reportTypeName)
    Return DirectCast(Activator.CreateInstance(reportType), Report)
End Function