2012-02-04 46 views
9

這樣或那樣的方式我需要將groupID(和另一個整數)鏈接到我動態添加的按鈕..任何想法?AddressOf帶參數

我能做些什麼;

AddHandler mybutton.Click, AddressOf PrintMessage 

Private Sub PrintMessage(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    MessageBox.Show("Dynamic event happened!") 
End Sub 

我不能做的,但想要;

AddHandler mybutton.Click, AddressOf PrintMessage(groupID) 

Private Sub PrintMessage(ByVal groupID as Integer) 
    MessageBox.Show("Dynamic event happened!" & groupID .tostring) 
End Sub 
+0

請參閱http://stackoverflow.com/questions/13401246/how-to-pass-parameters-in-addhandler-using-vb-net – 2016-01-28 12:59:52

回答

29

有沒有辦法與AddressOf本身做到這一點。你要找的是一個lambda表達式。

AddHandler myButton.Click, Function(sender, e) PrintMessage(groupId) 

Private Sub PrintMessage(ByVal groupID as Integer) 
    MessageBox.Show("Dynamic event happened!" & groupID .tostring) 
End Sub 
+1

我試圖用Sub如上所示,並在.NET 3.5中收到編譯錯誤:「表達式不會產生一個值」。將我的委託設置爲始終返回true的函數時,它工作正常。爲什麼?? – http203 2013-08-09 19:30:58

+1

@ http203這是3.5中lambda表達式語義的實現細節。僅爲返回值的lambdas添加了支持,並且「Sub」不返回值。這在較低版本的語言中已經放寬 – JaredPar 2013-08-09 19:36:06

0

使用按鈕的Tag屬性。

Button1.Tag = someObject 

AddressOf獲取方法的地址,因此您無法傳遞參數給它。

+4

我強烈建議不要使用控件的標籤屬性。這是一場維護噩夢;它的名字和它的靜態類型都不會提示被引用的對象。如果你想遵循這條路線,更好的選擇是從'Button'派生一個子類MyButton並添加一個新的,正確命名和類型化的屬性,比如'GroupId',然後使用它來代替'Tag'。 – stakx 2012-02-04 18:48:37

3

您可以創建自己的按鈕類,並添加你想要任何東西

Public Class MyButton 
    Inherits Button 

    Private _groupID As Integer 
    Public Property GroupID() As Integer 
     Get 
      Return _groupID 
     End Get 
     Set(ByVal value As Integer) 
      _groupID = value 
     End Set 
    End Property 

    Private _anotherInteger As Integer 
    Public Property AnotherInteger() As Integer 
     Get 
      Return _anotherInteger 
     End Get 
     Set(ByVal value As Integer) 
      _anotherInteger = value 
     End Set 
    End Property 

End Class 

您可以通過鑄造sender

Private Sub PrintMessage(ByVal sender As Object, ByVal e As EventArgs) 
    Dim btn = DirectCast(sender, MyButton) 
    MessageBox.Show(_ 
     String.Format("GroupID = {0}, AnotherInteger = {1}", _ 
        btn.GroupID, btn.AnotherInteger)) 
End Sub 

這些新特性訪問按鈕甚至可以在屬性窗口中設置(在Misc下)。

當前項目中定義的控件自動出現在工具箱中。

+0

如果您不打算將屬性用於除訪問私人字段以外的其他任何內容,則可以省略getter和setter。 – haiyyu 2012-02-04 18:52:47

+2

我還有VS 2008。 – 2012-02-04 19:04:24

0

根據所需的參數的複雜性和數量,有幾種方法可以做到這一點。 1.使用標籤添加複雜結構 2.繼承Button類並添加值作爲類成員,然後在使用它們之前填充它們。這給了你更多的靈活性。

如果您使用的是web版本 3.您不能將其添加到標籤,但對於簡單的值將其分配給索引使用.Attributes.Add(「name」)。這被添加到HTML標籤而不是服務器端。然後可以使用索引訪問複雜系統的服務器端結構。 4.使用會話存儲值並將會話引用存儲爲Name屬性,如上所述(#3)。

0

您可以使用委託這對於你的代碼如下非常清楚:

定義委託

Public Delegate Sub ControlClickDelegate(ByVal sender As Object, ByVal e As EventArgs) 

自定義按鈕

Public Class CustomButton 
    Inherits System.Windows.Forms.Button 
#Region "property delegate" 

    Private controlClickDelegate As ControlClickDelegate 

    Public Property ClickHandlerDelegate As ControlClickDelegate 
     Get 
      Return controlClickDelegate 
     End Get 
     Set(ByVal Value As ControlClickDelegate) 
      controlClickDelegate = Value 
     End Set 
    End Property 

#End Region 

    Public Sub RegisterEventHandler() 
     AddHandler Me.Click, AddressOf OnClicking 
    End Sub 

    Private Sub OnClicking(ByVal sender As Object, e As System.EventArgs) 
     If (Me.controlClickDelegate IsNot Nothing) Then 
      Me.controlClickDelegate(sender, e) 
     End If 
    End Sub 

End Class 

的MainForm

Public Class MainForm 
    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 

     Me.CusButton1.ClickHandlerDelegate = AddressOf Me.btnClick 
     Me.CusButton1.RegisterEventHandler() 
    End Sub 

    Private Sub btnClick(ByVal sender As Object, ByVal e As EventArgs) 
     Me.TextBox1.Text = "Hello world" 
     End Sub 

End Class