※ 引述《felixlin (享受痛苦)》之銘言:
: 現在有 form A 和 form B
: 我想要按下A中的buttonA後
: 其效果等於B中的buttonB
: ex : (in form_A)
: public sub button_A.Click(byval sender .... byval e ....) .....
: form_B.buttonB.click(sender,e)
: end sub
: 以上並沒有觸發buttonB.click
: 不知道有沒有先進能幫我解決這問題
: thank you :P
唔,好難做...
我找到一個方法是:
先看被動方 Form2, 寫成如下面的程式
Public Class Form2
Public Event b1(ByVal sender As System.Object, ByVal e As _
System.EventArgs)
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click, Me.b1
Console.WriteLine("hey")
Me.Button1.BackColor = Color.Red
End Sub
Public Sub b1_raiser(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
RaiseEvent b1(sender, e)
End Sub
End Class
Button1_Click是private, 於是額外設計一個event叫b1, 由b1_raiser觸發事件,
並由Button1_Click處理b1事件(見黃色部份).
注意事件b1與觸發器b1_raiser的參數,都與Button1_Click一樣,才能讓
一個Button1_Click既處理Button1.Click,也處理b1.
於是,Form2對外有個b1事件,並有b1_raiser程序為觸發器.
接下來,輪到Form1了,Form1要知道怎麼觸發Form2.b1事件.
觸發事件必須把 sender 跟 e 參數都帶過去,因 Form1.Button1 與 Form2.Button1
參數相同,直接帶過去即可.
Public Class Form1
'Dim WithEvents f2 As New Form2
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
'f2.b1_raiser(sender, e)
My.Forms.Form2.b1_raiser(sender, e)
End Sub
End Class
注意灰色註解處,雖然可以叫出 Form2.Button1 的工作,
但由前面 Form2.Button1 一行塗底色為紅色的程式,可以看出
在此若使用WithEvents,一點鳥用都沒有.
雖然可以做出相同的動作,但由f2觸發Form2.b1事件是借用另一個實體.
而透過 My.Froms.Form2.b1_raiser 觸發 Form2.b1 看起來顯然漂亮多了.
你所要寫的程式大約是如此:
Form1_Button1先做一些自己的工作,然後叫起 Form2 的 Button1_Click 所處理的
事件; Form2_Button1也先做一些自己的工作,然後叫起 Form1 的 Button1_Click
所處理的事件.
不過以上流程看起來是遞迴的,還要再透過參數 sender 判斷按的是哪個按鈕,
避免反覆進行工作.
參考資料: WithEvents範例碼
http://msdn.microsoft.com/en-us/library/stf7ebaz(VS.80).aspx
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.227.70
※ 編輯: yauhh 來自: 59.112.227.70 (05/25 00:55)