使进度条从公共类运行

时间:2013-06-10 19:50:52

标签: vb.net forms class progress-bar

我创建了一个带有像进度条和按钮这样的对象的表单。 我还在表单之外创建公​​共库代码

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

Public Shared Sub ModifyItems(ByRef _WhichForm As Form)<br>
   _WhichForm.MyProgressBar1.visible = true<br>
End sub<br>

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

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

1 个答案:

答案 0 :(得分:1)

这种方法通常属于“不良做法”的保护范围。让对象直接修改其他成员会引入紧密耦合,这使得难以扩展,调试和维护代码。

不是试图从库中修改某些内容,而是更好地考虑通知库中的某些内容已经发生变化。例如,您可以在库中引发事件。然后,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

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

请参阅此处以获取更多信息:Raising Events and Responding to Events (MSDN)