0

我创建了一个带有进度条和按钮等对象的表单。我还在我的表单之外创建了公共图书馆代码

我想从编写在库中的Sub修改进度条控件或按钮的文本(我尝试将我的表单作为参数传递):

Public Shared Sub ModifyItems(ByRef _WhichForm As Form)
   _WhichForm.MyProgressBar1.visible = True
End sub

不幸的是,代码无法识别进度条名称MyProgressBar1

有没有办法直接在类库中编写的函数中修改表单上的进度条控件,而不是直接在表单代码中?

4

1 回答 1

2

这种类型的方法通常属于“不良做法”的范畴。让对象相互修改成员直接引入了紧密耦合,这使得代码难以扩展、调试和维护。

与其尝试从库中修改某些内容,不如从通知库中的某些内容已更改的角度进行思考。例如,您可以在库中引发事件。 Form1然后可以侦听该事件并对其组件进行适当的更改。这种方式Form1单独负责修改其组件,而库单独负责宣布对其内部状态的更改。

举一个很好的例子——比如说,如果您要更改 Form 的进度条组件(也许您会找到更好的组件),您会突然在库中引入一个重大更改。

要使用事件,您可能会执行以下操作:

Public Class MyLibrary
    Event OnSomethingHappened()

    Private Sub SomethingHappened()
       RaiseEvent OnSomethingHappened()
    End Sub
End Class

然后以您的形式:

Public Class Form1
    Private WithEvents _myLibrary as New MyLibrary

    Private Sub LibraryDidSomething() Handles _myLibrary.OnSomethingHappened
        MyProgressBar1.Visible = True
    End Sub
End Class

这很好地解耦了任何依赖Form1——库作为一个独立的实体存在,并不关心谁在听它的事件。

如果您想对shared课程执行此操作,您还可以使用共享事件 - 这些必须以编程方式连接:

Public Class MyLibrary
    Shared Event OnSomething()

    Public Shared Sub DoSomething()
        RaiseEvent OnSomething()
    End Sub
End Class

形式:

Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
                                                        Handles MyBase.Load
       AddHandler MyLibrary.OnSomethingHappened, AddressOf LibDidSomething
    End Sub

    Private Sub Form1_FormClosed(sender As System.Object, e As _
        System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
       RemoveHandler MyLibrary.OnSomethingHappened, AddressOf LibDidSomething
    End Sub

    Private Sub LibDidSomething() 
        MyProgressBar1.Visible = True
    End Sub
End Class

当以编程方式添加事件时,您必须注意在处理已订阅它们的对象之前删除它们。在这种情况下,我在表单加载时添加了处理程序,并在表单关闭时将其删除。如果您未能删除添加的处理程序,则不会对表单进行垃圾收集,这将导致内存泄漏。

有关更多信息,请参见此处:引发事件和响应事件 (MSDN)

于 2013-06-10T20:19:55.100 回答