我正在尝试根据属性的新值,从公共属性(LogQry)的设置过程中更改按钮(cmdLogQry)的背景颜色。
如果将属性在代码属属中更改为包含按钮的形式(在相同或什至另一个按钮的Click方法中),则此方法有效。但是,如果要从另一个模块更改属性(对COM端口的DataReceived事件的处理程序),则此方法不起作用。没有错误消息或任何内容-LogQry的值可以正确更改,但按钮的颜色不会更改。
我做错了什么?
Public Class Handler
Private _logQry As Boolean = False
Public Property LogQry() As Boolean
Get
Return _logQry
End Get
Set(ByVal value As Boolean)
_logQry = value
If value Then
frmMain.cmdLogQry.BackColor = Color.Red
Else
frmMain.cmdLogQry.BackColor = Color.Blue
End If
End Set
End Property
Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
...
LogQry = Not LogQry ' does NOT change color
...
End Sub
End Class
Public Class frmMain
Private comm As New Handler()
...
Private Sub cmdLogQry_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLogQry.Click
comm.LogQry = Not comm.LogQry ' does change color
End Sub
...
End Class
此问题是由VB.NET实现创建的表单类的默认实例引起的。更多有关默认实例的信息可以在此处以及Hans Passant的答案中找到。
本质上,当您定义表单类时,VB.NET编译器会创建该类的默认实例,该实例的名称与该类的名称相同,但这会在诸如NET之类的面向对象的环境中造成许多误解。
要解决您的问题,您需要在Handler类中实现一个构造函数,以接收frmMain的实际实例,将其存储在类变量中,并在您想要在实际显示的表单上修改某些内容时使用该实例。
Public Class Handler
Private _logQry As Boolean = False
Private _mainInstance As frmMain
Public Sub New(mainInstance as frmMain)
_mainInstance = mainInstance
End Sub
Public Property LogQry() As Boolean
Get
Return _logQry
End Get
Set(ByVal value As Boolean)
_logQry = value
If value Then
_mainInstance.cmdLogQry.BackColor = Color.Red
Else
_mainInstance.cmdLogQry.BackColor = Color.Blue
End If
End Set
End Property
....
End Class
现在,当您创建Handler实例时,将对当前frmMain的引用传递给
Public Class frmMain
Private comm As Handler
...
Private Sub cmdLogQry_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLogQry.Click
comm = new Handler(Me)
comm.LogQry = Not comm.LogQry ' does change color
End Sub
...
End Class
请记住,此解决方案还会带来问题。它将类Handler耦合到您的frmMain,这两个现在是不可分割的。可能更好的方法是在Handler类中创建一个Event,因此,每个想要通知的表单都可以订阅该事件并在需要时接收信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句