2

I have different Crystal Reports in my project like:

RptHbl RptUBL RptMCB RptBAF

and so on...

Now I have a string with one of the report name which it gets from database Like:

Dim Myrptname = "RptHbl"

Now I want to load a Report, for which i usually use the following code to initialize the report

Dim Myrpt As New RptHbl

Now how I can use a report name which is stored in string Myrptname Like Dim Myrpt as New "MyrptName"??????? Thanks

1 Answer 1

1

First, you need the full name of the report class, so if the name in the database is just the class name, you'll need to append the namespace:

Dim reportName As String = "RptHbl"
Dim fullTypeName As String = "MyNamespace." & reportName ' Consider using the NameOf operator

Next, you can use Assembly.GetType which uses reflection to find the type (i.e. the class) by the full name. However, first you need to get a reference to the right assembly. If your reports are in the same assembly, you can do it like this:

Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
Dim reportType As Type = reportAssembly.GetType(fullTypeName)

However, if the reports are in a different assembly, then, as long as you have a reference to one of them, you could do it like this:

Dim reportAssembly As Assembly = GetType(RptHbl).Assembly
Dim reportType As Type = reportAssembly.GetType(fullTypeName)

Once you have that Type object that describes the report class, you can create an instance of it using the Activator.CreateInstance method, like this:

Dim report As Object = Activator.CreateInstance(reportType) 

I don't know enough about Crystal Reports to know, but I would assume that all report classes are derived from some base class. For the sake of example, let's just assume that they all inherit from a base class called Report. If so, then you can cast the new instance to that base type, like this:

Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)

So, to put it all together, you could do something along these lines:

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.