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
Vb.net 我可以使用AddressOf将委托子对象分配给AddHandler吗?_Vb.net_Delegates_Printdocument - Fatal编程技术网

Vb.net 我可以使用AddressOf将委托子对象分配给AddHandler吗?

Vb.net 我可以使用AddressOf将委托子对象分配给AddHandler吗?,vb.net,delegates,printdocument,Vb.net,Delegates,Printdocument,编辑:我最初的问题太令人困惑了 Public Class PrintResults Public Sub ResultsToPS(ByVal lis As List(Of FileData), ByVal PSPathName As String) Me.List = lis 'setup report writer Dim rep As New Helper.Report 'create report to PS

编辑:我最初的问题太令人困惑了

Public Class PrintResults

    Public Sub ResultsToPS(ByVal lis As List(Of FileData), ByVal PSPathName As String) 
        Me.List = lis

        'setup report writer
        Dim rep As New Helper.Report

        'create report to PS
        rep.ToPS(PSPathName)

    End Sub


Public Class Report
    Public Sub New()
        PrintDoc = New Printing.PrintDocument
    End Sub

    Public WithEvents PrintDoc As Printing.PrintDocument

    Public PrintDocPrintPage As PrintDoc_PrintPage
    Public Delegate Sub PrintDoc_PrintPage(ByVal sender As Object, _
                        ByVal e As Printing.PrintPageEventArgs) 'Handles PrintDoc.PrintPage 

    Public Function ToPS(ByVal PSPathName As String) As String

        'fails
        AddHandler Me.PrintDoc.PrintPage, AddressOf Me.PrintDocPrintPage

        Me.PrintDoc.Print()

    End Function

AddHandler有编译器错误:AddressOf操作数必须是方法的名称。有没有办法将处理程序分配给委托子系统?

也许创建事件并向其附加函数就是您要寻找的

Sub Main()

    Dim c As New TestClass

    AddHandler c.OnComplete, AddressOf Test

    c.Execute() ' Will print Done

    Console.ReadLine()

End Sub

Sub Test()
    Console.WriteLine("Done")
End Sub

Class TestClass

    Public Event OnComplete()

    Public Sub Execute()
        RaiseEvent OnComplete()
    End Sub

End Class

通过一些研究,我发现不可能使用带有AddressOf的代理sub。因此,我们需要一种不同的方法。我现在看到,我所要做的就是在新的子对象中实例化PrintDoc。现在我有了一个PrintDoc对象供AddHandler使用

Public Class Report
    Public Sub New()
        PrintDoc = New Printing.PrintDocument
    End Sub
我们使用不带委托的常规AddHandler:

Public Class PrintResults

    Public Sub ResultsToPS(ByVal lis As List(Of FileData), ByVal PSPathName As String) 
        Me.List = lis

        'setup report writer
        Dim rep As New Helper.Report

        'PrintDoc is automatically instatiated so no object error
        AddHandler rep.PrintDoc.PrintPage, AddressOf Me.PrintDoc_PrintPage      

        'create report to PS
        rep.ToPS(PSPathName)

    End Sub


这正是我正在做的事情。我调用
rep.InitiatePrintDoc()
来实例化
PrintDoc
。然后我将处理程序添加到新创建的
PrintDoc
。然后我打印。好的但我不想先实例化。我想我可以分配一个委托,然后让“Report”类实例化对象,然后添加处理程序本身。但它不起作用。您当前的类间依赖关系非常混乱。想必,您希望
Report
成为主类,但您希望能够将
PrintResults
的实例分配给
Report
,该实例允许通过调用
Report
中的方法将
列表(文件数据)
自定义打印到
PSPathName
。这描述了你的目标吗?