【问题标题】:Make Progress Bar Running From Public Class从公共课上制作进度条
【发布时间】:2013-06-10 19:50:51
【问题描述】:

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

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

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

很遗憾,代码无法识别进度条名称MyProgressBar1

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

【问题讨论】:

  • 类库中的代码通常不应涉及 UI。您使用事件来获得隔离。例如,此代码应该触发 ProgressChanged 事件。

标签: vb.net forms class progress-bar


【解决方案1】:

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

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

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

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多