2014-04-17 138 views
1

我已經找到了關於這個主題的一些信息,但是我仍然不完全理解它,如果有人會告訴我如何在我的例子中做到這一點,我會很高興。如何使用/傳遞參數給事件處理程序?

基本上,我有填充有在VB.Net視窗對象的數組窗體應用程序

Dim button(9) As cbuttons 

public sub fill() 
    button(1) = New cbuttons("buttonName1", 2, true) 
    button(2) = New cbuttons("ButtonName2", 3, true) 
    button(3) = New cbuttons("ButtonName3", 4, true) 
    ... 

此陣列用作按鈕,它們是動態生成的

public sub writeButtons() 
    For Each item As cbutton In button 

     Dim cmbDynamic As New Button() 
     cmbDynamic.Location = New System.Drawing.Point(item.getX(), item.getY()) 
     cmbDynamic.Name = item.getname() 
     cmbDynamic.Text = item.getName() & vbCrLf & item.getTypeString() 
     TabPage1.Controls.Add(cmbDynamic) 
     AddHandler cmbDynamic.Click, AddressOf Me.clicked 'here is the problem 

然後,源我有一個子應該這樣做這樣的

public sub clicked() 
    MessageBox.Show("You clicked on button " & ButtonName) 

但是,我不知道如何將按鈕的名稱(或任何其他參數)傳遞給子點擊(),因爲我不能將任何參數添加到AddHalnder線和callByName()也不起作用

我正在尋找一個解決方案可能看起來像這樣在Javascript中指出:

onlick="clicked(this.id)" 

謝謝

回答

3

的方法必須有相匹配的Control.Click事件委託,在這種情況下是參數。因此,clicked方法需要一個Object類型參數,然後是EventArgs類型參數。

第一個參數代表發生事件的對象。因此,在處理程序中鑄造它,你就可以得到任何它的性能,包括Name

Public Sub clicked(sender As Object, e As EventArgs) 
    MessageBox.Show("You clicked on button " & CType(sender, Control).Name) 
End Sub 

編輯:

在你問如何額外的參數傳遞到事件處理的意見方法。對此,簡短的回答是否定的。

但是,有辦法解決這個問題。您可以將值存儲在類範圍內並在處理程序中訪問它們。您也可以在每個ButtonTag屬性中存儲信息。由於處理程序始終有一個代表提升事件的對象的參數Object,因此可以在其上下文中檢索其任何屬性。

例如,當你創建一個新的Button例如,可以將其Tag屬性設置爲從正在創建它的cbutton值:

Public Sub writeButtons() 
    ' ... 

    Dim cmbDynamic As New Button() 
    ' ... 
    cmbDynamic.Tag = item 

    ' ... 
End Sub 

所以,以後,你就可以僅僅通過這樣收回全部cbutton值:

Public Sub clicked(sender As Object, e As EventArgs) 
    Dim btn As Button = sender 
    Dim item As cbutton = btn.Tag 

    MessageBox.Show("You clicked on button " & item.getname() & " which has cbutton.anyproperty equals to " & item.anyproperty) 


End Sub 

你可以把Tag財產自由泳存儲。建議的話雖然:不要濫用它。你使用它越多,你的代碼就越難弄清楚。另外,如果你有多個使用它們的技工,你最終可能會在這些方面產生意想不到的價值。

附加說明:

作爲每.NET慣例,對於類型和類型成員的優選殼是每個字以大寫字母開頭。例如,writeButtons確實應該是WriteButtons。我還應該提到,從Write開始的方法建議發生I/O操作。在你的情況下,CreateButtons聽起來更合適。

+0

你真的幫了我很多,謝謝。即使認爲我現在不需要它,但我很好奇是否可以傳遞超過1個參數。 – Labe

+1

@Labe我編輯了我的答案,看看它是否有幫助。 – Crono

相關問題