2015-02-06 51 views
2

我想從公共屬性(LogQry)的Set-procedure中更改按鈕(cmdLogQry)的背景顏色 - 根據新物業的價值。vb.net-如何從另一個模塊更改表單元素的屬性

如果屬性在代碼belongsig中更改爲包含按鈕的窗體(在同一個或甚至另一個按鈕的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 
+0

設置斷點並查看是否正在調用事件 – Plutonix 2015-02-06 14:25:45

回答

1

此問題是由VB.NET實現創建窗體類的默認實例引起的。更多關於默認實例could be found herethis answer from 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 

現在,當你創建了處理程序實例通過參考當前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,因此,每個想要通知的表單都可以訂閱該事件並在需要時接收信息。

+0

非常感謝!現在我明白爲什麼它不起作用。而你的解決方案完美無缺! – Hando 2015-02-06 18:26:58

相關問題