我创建了一个带有像进度条和按钮这样的对象的表单。 我还在表单之外创建公共库代码
我的问题是:我想从库中编写的Sub修改进度条或文本按钮(我尝试将表单作为参数传递):
Public Shared Sub ModifyItems(ByRef _WhichForm As Form)<br>
_WhichForm.MyProgressBar1.visible = true<br>
End sub<br>
不幸的是,代码无法识别我的进度条名称:MyProgressBar1
有没有办法直接在类或库中编写的Sub或函数中修改我的表单上的进度条,而不是直接在表单代码中?
答案 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)