你需要的應該是反射,類似如下,我測試通過的:
公司專注于為企業(yè)提供成都網(wǎng)站建設、成都網(wǎng)站設計、微信公眾號開發(fā)、電子商務商城網(wǎng)站建設,微信小程序,軟件按需求定制制作等一站式互聯(lián)網(wǎng)企業(yè)服務。憑借多年豐富的經(jīng)驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務。
Imports?System.Reflection
Public?Class?Form1
Public?Sub?MMMToolStripMenuItem_Click(sender?As?Object,?e?As?EventArgs)?Handles?MMMToolStripMenuItem.Click
MsgBox("menu?click")
End?Sub
'灶銀在按鈕事件處理里面通過反射名稱調(diào)用相應菜單事數(shù)友件薯辯槐
Public?Sub?CallEventMethod(sender?As?Object,?e?As?EventArgs)
Dim?b?As?Button?=?sender?'獲取點擊的按鈕
'拼接菜單事件名稱
Dim?MethodName?As?String?=?b.Name??"ToolStripMenuItem_Click"
Dim?t?As?Type?=?Me.GetType
Dim?m?As?MethodInfo?=?t.GetMethod(MethodName)
'反射方法
m.Invoke(Me,?New?Object()?{Nothing,?Nothing})
End?Sub
'動態(tài)生成了按鈕
Private?Sub?Form1_Load(sender?As?Object,?e?As?EventArgs)?Handles?MyBase.Load
Dim?btn?As?New?Button
btn.Location?=?New?Point(100,?100)
btn.Name?=?"MMM"?'關鍵
btn.Text?=?"MMM"
'注冊事件
AddHandler?btn.Click,?AddressOf?Me.CallEventMethod
Me.Controls.Add(btn)?
End?Sub
End?Class
熟悉VB的朋友對使用ActiveX控件一定不會陌生,眾多控件極大地方便了編程,但
唯一的缺陷是不能動態(tài)加載控含雀逗件,必須在設計時通過引用,將控件放置在窗體上。
VB6.0已能夠解決該問題,只是幫助中沒有明確說明,并且沒有描述到一些關鍵功能,
由于以前的版本中可以動態(tài)創(chuàng)建進程外服務:如果對象是外部可創(chuàng)建的,可在 Set 語
句中用 New 關鍵字、CreateObject 或 GetObject 從部件外面將對象引用賦予變量。
如果對象是從屬對象,則需使用高層對象的方法,在 Set 語句中指定一個對象引用:
Dim xlApp1 As Excel.Application
Set xlApp1 = New Excel.Application
或
Dim xlApp As Object '定義存放引用對象的變量。
Set xlApp = CreateObject("excel.application")
xlApp.Visible = True
---- 這些語法很容易造成誤導,以為動態(tài)加載ActiveX控件也是此方法,可能有朋友也
象我一樣利用CreateObject嘗試了無數(shù)次,卻無功而返,不知微軟公司是出于何種考
慮,動態(tài)加載ActiveX控件是擴展控件集合的方式實現(xiàn),通過實際摸索,終于就如何實
現(xiàn)動態(tài)ActiveX控件找出了一條切實可行的方法,下面以一個具體的實例來詳細說明。
一、ActiveX控件
---- ActiveX 控件是 Visual Basic 工具箱的擴充部分。使用 ActiveX 控件的方法與
使用其它標準內(nèi)裝的控件,如 CheckBox 控件,完全一樣。在程序中加入 ActiveX 控
件后,它將成為開發(fā)和運行環(huán)境的一部分,并為應用程序提供新的功能。
---- ActiveX 部件通過客戶端/服務器關系與應用程序— 及與部件相互之間— 交互作
用??蛻舳耸鞘褂貌考δ艿膽贸绦虼a或部件。服務器是部件及其關聯(lián)的對象。例
如,假設應用程序使用 ActiveX 控件來提供一個標準的雇員窗體,供公司的多種應用
程序使用。提供雇員窗體的 ActiveX 控件就是服務器,使用這個控件的應用程序就是
服務器的客戶端。
二、加載方法
---- VB6.0中對Controls 集合進行了擴展,以前版本中Controls 集合在窗體上列舉出
已加載的控件,這在迭代過程中是很有用的。Controls 集合標識一個叫做 Controls
的內(nèi)在窗體級變量。如果忽略可選的 object 所在處的整數(shù),則關鍵字 Controls 必須
包括在內(nèi)。我們通常在窗口中使用如下代碼:
Text1.Text="Hello, world"
其實也可以使用如下代碼達到同一目的:
Controls(1).Text="Hello, world"
---- 在VB6.0中除了原來的Clear、Remove 方法外(很奇怪,為什么微談賣軟在VB5.0中只提
供這兩種方法,而沒有提供Add方法,因為沒有Add,這兩種方法也就沒什么用處),增
加了Add方法,該方法就是用于動態(tài)加載控件的:
Controls.Add(progid as String, Name as String);
progid: ActiveX部件的ProgID,如:"VB.CheckBox";
Name:ActiveX部件加載后的名稱,如: "MyCheckBox";
若要在窗體上添歲前加一個名為MyButton的按鈕,可以使用:
dim oControl as Object '窗體級變量
注意:這里聲明為Object對象類型
Private Sub LoadControl()
Set oControl = Controls.Add
("VB.CommandButton", "MyButton")
oControl.Left = 10
oControl.Top = 10
oControl.Visible = True '使控件可見
End Sub
---- 這是VB6.0的標準語法,它在例程中也是如此演示的,不過該方法雖然現(xiàn)實了控件
的動態(tài)加載,按鈕顯示在窗體上,可以象普通按鈕一樣按下去,但加載的控件不能預先
設計響應事件代碼,如:事件Sub MyButton_Click()將是非法的,當然,可以將要響應
的事件封裝在控件內(nèi)部。就編程的觀點來看該方法沒什么大的用處,開發(fā)ActiveX控件
的目的是為了資源共享,為了被其他開發(fā)人員利用,所以要提供必要的事件接口,顯然
利用該方法不行,通過分析VBControls等相關對象,找出VBControlExtender對象與
EventInfo相結合能提供事件陷井捕捉,VBControlExtender對象對動態(tài)添加控件特別有
用,它提供了一套通用的屬性、方法、事件給開發(fā)人員,它的一個突出特點是能編程設
計控件的事件,熟習類編程的朋友對帶事件的對象聲明一定不會陌生:
---- Dim WithEvents objElemt as CElemtVBControlExtender也不例外,聲明的語法
一樣,只不過它有個特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到對象使
用RaiseEvent產(chǎn)生的所有事件,EventInfo數(shù)據(jù)結構映射了事件的名稱、參數(shù)個數(shù)和參
數(shù)的值。VBControlExtender和 EventInfo相結合,采用Select Case 就可以預先將不
同類對象的事件放置一起,各自獨立運作。將上面的代碼改寫一下就能提供Click事件
了:
---- Dim WithEvents oControl As VBControlExtender '帶事件聲明聲明之后您就可
以在代碼窗口的左上角的對象下拉框中發(fā)現(xiàn)該對象出現(xiàn)了,也就是說,該對象有了事件
或方法了,它的事件有DragDrop,DragOver ,LostFocus ,GotFocus ,ObjectEvent
和Validate,其中ObjectEvent是通用的事件捕捉。
Private Sub LoadControl()
Set oControl = Controls.Add
("VB. CommandButton", "MyButton")
oControl.Visible = True
End Sub
Private Sub oControl_ObjectEvent(Info As EventInfo)
Select Case Info.Name
Case "Click" 'Click事件
'您可以添加處理Click事件代碼
MsgBox "您按了MyButton!"
Case Else ' 其他事件
' Handle unknown events here.
End Select
End Sub
---- 當然對微軟提供的標準控件能采用該方法添加,大家都不會懷疑,但自己開發(fā)的
控件也能嗎?答案是肯定的,我們可以用一個實際的例子進行說明。
''' summary
''' 添加多個按鈕到一個容器中.
''' /summary
''' param name="StartPos"所有按鈕開始點./param
''' param name="ButtonSize"按鈕的大小.念磨/param
''' param name="絕敗ButtonSpace"按鈕的間距/param
''' param name="ButtonCount"按鈕的總數(shù)/param
''' param name="AddingContainer"被添加到的容器/param
''' remarks/remarks
Private Sub AddButtons(ByVal StartPos As Point, ByVal ButtonSize As Size, _
ByVal ButtonSpace As Size, ByVal ButtonCount As Integer, _
ByVal AddingContainer As Control)
Dim mBtnPos As Point = StartPos
For ItemTemp As Integer = 0 To ButtonCount - 1
Dim NewButton As Button = New Button() With
mBtnPos.Y += ButtonSpace.Height + ButtonSize.Height
If mBtnPos.Y AddingContainer.Height Then
mBtnPos.Y = StartPos.Y
mBtnPos.X += ButtonSpace.Width + ButtonSize.Width
End If
NewButton.Text = String.Format(":", CStr(ItemTemp + 1))
AddHandler NewButton.Click, AddressOf btnzh_Click
AddingContainer.Controls.Add(NewButton)
Next
End Sub
Private Sub btnzh_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnzh.Click
Dim ItemCount As Integer = 0
Try
ItemCount = CInt(txtChoice.Text)
Catch ex As Exception
MessageBox.Show("您輸入的數(shù)字無并高顫法解析為數(shù)字.")
Return
End Try
AddButtons(New Point(2, 2), New Size(60, 40), New Size(20, 30), ItemCount, Me)
End Sub
Private Sub btnzh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
End Sub
先要新建一個index為0的菜單(設置為不可慎族見),然后把動態(tài)生產(chǎn)的菜單加入進來,這配孝燃樣就可以使用遍歷菜單的方法,并判讀下當前按培虛下的菜單名稱。
參看:網(wǎng)頁鏈接