2017-04-12 56 views
-1

我正在學習vb.net,並且遇到了搜索需要的問題。我想在整個應用程序中創建一個「可重用」的按鈕,而無需爲每個實例編寫代碼。所以,我想從一個表單中獲取一個變量,例如公共整數值,當這個值改變時,我想寫入一個按鈕的文本。我知道我可以通過以btn_xxx.text = variable的形式編寫代碼來輕鬆完成此操作,但是如果我有幾個按鈕並且每個按鈕都看着相同的變量,該怎麼辦?目前我所做的是創建一個繼承按鈕並具有一個計時器的組件,該計時器在打勾時會查看變量並寫入文本。我確信有更好的方法。任何人都可以將我指向正確的方向嗎?我知道我的問題的一部分是我不知道什麼是所謂的命名,所以希望我問我的問題沒有太多的困惑。將值從形式傳遞到按鈕文本vb.net

我看到這個,https://www.daniweb.com/programming/software-development/threads/124842/detect-variable-change,但我沒有看到如何適應我的情況。

以下是我有:

Private WithEvents Active_Alarm As New Nav_Active_Alarm 
計算計數子內

然後:

Active_Alarm.Count = CInt(dt_Active_Alarms.Rows.Count) 

用戶控件:

Public Class Nav_Active_Alarm 

Private mActive_Alarm_Count As Integer 
Public Event Active_Alarm_Count_Changed(ByVal mvalue As Integer) 
Public Property Count() As Integer 
    Get 
     Count = mActive_Alarm_Count 
    End Get 
    Set(ByVal value As Integer) 
     mActive_Alarm_Count = value 
     If Not Me.DesignMode Then 
      RaiseEvent Active_Alarm_Count_Changed(mActive_Alarm_Count) 
      test() 
     End If 

    End Set 
End Property 

Private Sub test() 

    If Not Me.DesignMode Then 

     If mActive_Alarm_Count = 0 Then 
      Me.btn_Goto_Active_Alarm.Image = My.Resources.Alarm_Clock_Static 
      'console or msgbox will work but updating the image will not 
     Else 
      Me.btn_Goto_Active_Alarm.Image = My.Resources.Alarm_Clock_Animation 
       'console or msgbox will work but updating the image will not 
      End If 

    End If 

End Sub 

End Class 

如果我寫安慰或添加一個msgbox我會看到事件工作。但是,圖像不會改變。如果我從計時器中調用測試子,它將起作用。爲什麼不更新按鈕(順便說一句,我嘗試刷新並更新代碼)?

+0

這不是關於'Button'的。一個普通的'Button'將會很好。你真正需要做的是使用一個帶有相應的Changed事件的屬性,然後將每個Button的Text屬性綁定到該屬性。每當你改變屬性值時,事件都會被提升,並且會提示所有的'綁定'來更新'按鈕'。 – jmcilhinney

+0

我問的是可能的嗎?不尋找其他方法,只是想知道我問的是否可能。另外,對我游泳得如何的觀點不感興趣。我有理由想要這樣做,這將需要很多努力來解釋。我基本上想創建一個簡單的組件庫,所有你需要做的就是拖放。文字只是一個方面,圖像,顏色等 – James

+0

任何人都可以解釋爲什麼我發佈的代碼將無法正常工作?如果我通過計時器打勾調用「測試」,它將起作用,但是如果我從事件中調用它不會,但是,我可以通過控制檯寫入或msgbox查看事件的工作情況。 – James

回答

0

觀察者模式是你可能要找的東西。

這是快速和骯髒。

創建一個類來保存變量值。添加一個將按鈕實例添加到列表的方法。 然後需要知道變量的按鈕調用寄存器方法。 當變量的值發生變化時,它遍歷按鈕列表並設置每個按鈕的Text屬性。

您可能在這裏跳得太快了一點。 .net中的Google自定義數據綁定,可以使用大量內置的東西。雖然自己做是一個很好的練習。

0

一個簡單的方法來做到這一點可能是:

  1. 創建一個表單級列表來保存你感興趣的

  2. 按鈕添加你感興趣的按鈕,進入名單(也許在形式上負載或者你有初始化代碼一些其他的地方)

  3. 與背襯變量創建表單的私人財產抱着你要已經申請到的按鈕值。在setter部分中旋轉列表並設置每個按鈕的文本。

 


    Dim lstButtons As New List(Of Button) 

    Sub SetupButtons() 
     'call from form load or other init code 
     lstButtons.Add(btnPopulate) 
     lstButtons.Add(btnPopulate) 
    End Sub 


    Private _buttonText As String 
    Private Property ButtonText As String 
     Get 
      Return _buttonText 
     End Get 
     Set(value As String) 
      _buttonText = value 
      For Each b As Button In lstButtons 
       b.Text = value 
      Next 
     End Set 
    End Property 

 

當你設置屬性 - 現在充當你的變量 - 這將更新所有文本框的爲您服務。

我意識到你在不必編寫代碼的情況下提到了你 - 但必須將事情聯繫在一起。即使你使用觀察者模式(這是一個優雅的解決方案 - 所以支持那些推薦它的人),你最終可能會創建一個類來保存該屬性,並讓該類從System.ComponentModel實現INotifyPropertyChanged,並且那麼你也必須讓每個按鈕的文本屬性都有一個數據綁定到你的類的對象中的屬性。沒有辦法(我能想到)不必爲每個表單編寫一些代碼(儘管只需要編寫一次類部件)。

+0

我現在擁有它的方式需要零代碼,但它使用了一個定時器,我認爲它非常笨重。我相信這只是我不能正確地提出問題。我會自己解決。謝謝。 – James

相關問題