将字符串转换为类,Crystal Report Printing

时间:2014-10-24 12:45:09

标签: vb.net crystal-reports report

我试图让我的代码变得更加完美,我正在使用Crystal Report,对于一个项目,我使用的代码可以更快地打印Crystal Report而无需选择打印机,问题是,我使用了很多水晶报告,我想创建一个可以帮助我的功能,通常我使用该方法:

Select Case string_printer

        Case "cristale1"
            cristale1.PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto
            cristale1.PrintToPrinter(NB_Copy.Value, True, 0, 2)
            cristale1.Close()

        Case "cristale2"
            cristale2.PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto
            cristale2.PrintToPrinter(NB_Copy.Value, True, 0, 2)
            cristale2.Close()

        Case "cristale3"
            cristale3.PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto
            cristale3.PrintToPrinter(NB_Copy.Value, True, 0, 2)
            cristale3.Close()

End Select

我尝试做的是这样的事情:

Sub Print_Report(string_printer as String , NB_Copy as Integer)
    Dim class_here =  // CHANGING THE STRING to the Class using the string_printer
    Dim data = Ctype(class_here,ReportClass)
    data .PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto
    data .PrintToPrinter(NB_Copy, True, 0, 2)
    data .Close()
End Sub

任何想法?

2 个答案:

答案 0 :(得分:0)

(我的VB有点生疏)怎么样

Dim printer;

Select Case string_printer
    Case "cristale1"
        printer = cristale1;
    Case "cristale2"
        printer = cristale2;
    Case "cristale3"
        printer = cristale3;
End Select

printer.PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto
printer.PrintToPrinter(NB_Copy.Value, True, 0, 2)
printer.Close()

ETA:找到了这个

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

所以这应该有用

Sub Print_Report(string_printer as String , NB_Copy as Integer)
  Dim class_here = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string_printer)
  Dim data = Ctype(class_here,ReportClass)
  data .PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto
  data .PrintToPrinter(NB_Copy, True, 0, 2)
data .Close()
End Sub

或者您可以使用this

Activator.CreateInstance("PersonInfo", "Person");

答案 1 :(得分:0)

你可以试试(抱歉,这是C#):

public Printer GetByName(string name) {
    return this.GetType().GetFields().First(f => f.Name == name).GetValue(this) as Printer;
}

GetFields docs。这使用反射,因此如果您经常访问此代码,则可能效率低下。但是,我认为这不会是一个问题。但是,如果它会,那么我建议你坚持使用当前的方法。

请注意,使用反射会产生cristale1,2,3字段的非显而易见的用法。这可能应该在某处记录,以便您的代码读者确信这些是必要的,GetByName是他们使用的地方。

可以找到显示基础知识的工作示例here