2016-11-05 117 views
0

非常簡單的情況。
窗體類觸發一個MsgBox奇怪WithEvents東西

Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MessageBox.Show("TEST") 
    End Sub 
End Class 

然後創建一個新的類的Class1和移動子的button1_Click於該類

Public Class Form1 

End Class 
Public Class Class1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Form1.Button1.Click 
     MessageBox.Show("TEST") 
    End Sub 
End Class 

我也得到一個失敗一個按鈕內

故障BC30506句柄子句需要一個WithEvents變量,該變量在包含類型或其基類型中定義。

然後我修改這樣的:

Public Class Class1 
    Public WithEvents Form1.Button As EventThrower() 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Form1.Button1.Click 
     MessageBox.Show("TEST") 
    End Sub 
End Class 

現在我得到2個故障

錯誤BC30412 'WITHEVENTS' 變量必須有一個爲條款。

錯誤BC31412類中的'Handles'必須指定一個WithEvents變量, 'MyBase','MyClass'或'Me'用單個標識符限定。

有人可以用簡單的方式解釋我嗎?

更新1:
從Visual文森特未來解決方案消除了錯誤,但通過點擊Form1中Button1的MessageBox中被解僱沒有,所以實際上它不工作。

Public Class Class1 
    Public WithEvents Button1 As Button = Form1.Button1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MessageBox.Show("TEST") 
    End Sub 
End Class 

如何從Class1中觸發Form1上的Button1?

+0

什麼是'EventThrower'? –

+0

EventThrower是引發事件的對象。 –

+0

您將無法單擊某個類中的按鈕,並且在另一個類中引發事件(甚至可能不會實例化)。 – Plutonix

回答

1

但通過單擊Form1上的Button1 MessageBox不會被觸發,所以實際上它不工作。

Public WithEvents Button1 As Button = Form1.Button1 

基於您的代碼Form1是一個類。其中Form1.Button1表示類Form1具有靜態變量Button1

很明顯,您的Form1類中有Button1,只能通過Form1的實例訪問。要得到正確的Form1實例,您需要將該實例作爲參數傳遞給Class1

那麼你的代碼:

Public WithEvents Form1.Button As EventThrower() 
  1. 的變量名稱不能包含點(如@Visual文森特提到的)
  2. 你可以聲明僅單個變量而不是數組,與WITHEVENTS。
    ... As EventThrower()的聲明類型的數組EventThrower

所以你需要更改線路是你的代碼,你試試用按鈕的情況下,處理EventThrower

Public WithEvents MyEventThrower As EventThrower 

主要問題類型是Click事件在另一個班級,這不是一個好的做法。

如果您想將Click處理程序的代碼移至另一個類,請執行回覆依賴關係。表單將對類依賴它包含邏輯

Public Class LogicClass 
    Public Function ExecuteSomeLogicAndReturnValue() As String 
     Return "TEST" 
    End Sub 
End Class 

Public Class MyForm Inherits Form 
    Private _Logic As New LogicClass() 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Me.MyButton.Click 
     Dim value As String = _Logic.ExecuteSomeLogicAndReturnValue() 
     MessageBox.Show(value) 
    End Sub 
End Class 
+0

你的代碼接縫很有趣,但我不明白它是如何回答我的問題的。請更詳細。 –

1

我不知道的EventThrower是什麼,但你的變量聲明是無效的。在訪問修飾符(在這種情況下爲Public)之後,應該有一個名稱,並且名稱不能包含點。

我會建議你做這樣的事情,而不是:

Public Class Class1 
    Public WithEvents Button1 As Button = Form1.Button1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MessageBox.Show("TEST") 
    End Sub 
End Class 

爲了使這項工作沒有一個類的實例,你可以標記的一切,Shared編輯:正如我懷疑你必須至少訪問一次類,否則處理程序不會被連接。調用一個空方法應該足夠了:

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Class1.Initialize() 
    End Sub 
End Class 

Public Class Class1 
    Public Shared WithEvents Button1 As Button = Form1.Button1 
    Private Shared Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     MessageBox.Show("TEST") 
    End Sub 

    Public Shared Sub Initialize() 
    End Sub 
End Class 
+0

您的建議是刪除錯誤,但單擊Form1上的Button1不會觸發MessageBox –

+0

@eichertc:您需要創建該類的實例或使其全部爲「共享」。讓我更新答案。 –

+0

@eichertc:可能,您還需要訪問類中的某些內容,以便處理程序得到連接。當我回來的時候,我會更多地考慮... –

1

試試這個:

Public Class Form1 

'Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
' MessageBox.Show("TEST") 
'End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     AddHandler Button1.Click, AddressOf Class1.ButtonClick 
    End Sub 

End Class 

Public Class Class1 

    Public Shared Sub ButtonClick(sender As Object, e As EventArgs) 
     MessageBox.Show("Clicked from ButtonClick") 
    End Sub 

End Class 
+1

我同意,手動附加處理程序在這裏更實用,可讀性更強。 – Jens