vb.net动态按钮事件的简单介绍

(vb.net)动态添加的控件如何多次响应事件?熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但
唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上 。
VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,
由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在Set语
句中用New关键字、CreateObject或GetObject从部件外面将对象引用赋予变量 。
如果对象是从属对象,则需使用高层对象的方法,在Set语句中指定一个对象引用:
DimxlApp1AsExcel.Application
SetxlApp1=NewExcel.Application

DimxlAppAsObject'定义存放引用对象的变量 。
SetxlApp=CreateObject("excel.application")
xlApp.Visible=True
----这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋友也
象我一样利用CreateObject尝试了无数次,却无功而返 , 不知微软公司是出于何种考
虑,动态加载ActiveX控件是扩展控件集合的方式实现 , 通过实际摸索,终于就如何实
现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说明 。
一、ActiveX控件
----ActiveX控件是VisualBasic工具箱的扩充部分 。使用ActiveX控件的方法与
使用其它标准内装的控件 , 如CheckBox控件,完全一样 。在程序中加入ActiveX控
件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能 。
----ActiveX部件通过客户端/服务器关系与应用程序—及与部件相互之间—交互作
用 。客户端是使用部件功能的应用程序代码或部件 。服务器是部件及其关联的对象 。例
如,假设应用程序使用ActiveX控件来提供一个标准的雇员窗体 , 供公司的多种应用
程序使用 。提供雇员窗体的ActiveX控件就是服务器,使用这个控件的应用程序就是
服务器的客户端 。
二、加载方法
----VB6.0中对Controls集合进行了扩展,以前版本中Controls集合在窗体上列举出
已加载的控件,这在迭代过程中是很有用的 。Controls集合标识一个叫做Controls
的内在窗体级变量 。如果忽略可选的object所在处的整数,则关键字Controls必须
包括在内 。我们通常在窗口中使用如下代码:
Text1.Text="Hello,world"
其实也可以使用如下代码达到同一目的:
Controls(1).Text="Hello,world"
----在VB6.0中除了原来的Clear、Remove方法外(很奇怪 , 为什么微软在VB5.0中只提
供这两种方法,而没有提供Add方法 , 因为没有Add , 这两种方法也就没什么用处),增
加了Add方法,该方法就是用于动态加载控件的:
Controls.Add(progidasString,NameasString);
progid:ActiveX部件的ProgID,如:"VB.CheckBox";
Name:ActiveX部件加载后的名称 , 如:"MyCheckBox";
若要在窗体上添加一个名为MyButton的按钮,可以使用:
dimoControlasObject'窗体级变量
注意:这里声明为Object对象类型
PrivateSubLoadControl()
SetoControl=Controls.Add
("VB.CommandButton","MyButton")
oControl.Left=10
oControl.Top=10
oControl.Visible=True'使控件可见
EndSub
----这是VB6.0的标准语法,它在例程中也是如此演示的 , 不过该方法虽然现实了控件
的动态加载 , 按钮显示在窗体上,可以象普通按钮一样按下去,但加载的控件不能预先
设计响应事件代码,如:事件SubMyButton_Click()将是非法的,当然,可以将要响应
【vb.net动态按钮事件的简单介绍】的事件封装在控件内部 。就编程的观点来看该方法没什么大的用处,开发ActiveX控件
的目的是为了资源共享,为了被其他开发人员利用 , 所以要提供必要的事件接口 , 显然
利用该方法不行,通过分析VBControls等相关对象,找出VBControlExtender对象与
EventInfo相结合能提供事件陷井捕捉,VBControlExtender对象对动态添加控件特别有
用,它提供了一套通用的属性、方法、事件给开发人员 , 它的一个突出特点是能编程设
计控件的事件,熟习类编程的朋友对带事件的对象声明一定不会陌生:
----DimWithEventsobjElemtasCElemtVBControlExtender也不例外,声明的语法
一样,只不过它有个特殊的事件ObjectEvent(InfoAsEventInfo),它能捕捉到对象使
用RaiseEvent产生的所有事件 , EventInfo数据结构映射了事件的名称、参数个数和参
数的值 。VBControlExtender和EventInfo相结合 , 采用SelectCase就可以预先将不
同类对象的事件放置一起,各自独立运作 。将上面的代码改写一下就能提供Click事件
了:
----DimWithEventsoControlAsVBControlExtender'带事件声明声明之后您就可
以在代码窗口的左上角的对象下拉框中发现该对象出现了,也就是说,该对象有了事件
或方法了,它的事件有DragDrop , DragOver,LostFocus,GotFocus,ObjectEvent
和Validate,其中ObjectEvent是通用的事件捕捉 。
PrivateSubLoadControl()
SetoControl=Controls.Add
("VB.CommandButton","MyButton")
oControl.Visible=True
EndSub
PrivateSuboControl_ObjectEvent(InfoAsEventInfo)
SelectCaseInfo.Name
Case"Click"'Click事件
'您可以添加处理Click事件代码
MsgBox"您按了MyButton!"
CaseElse'其他事件
'Handleunknowneventshere.
EndSelect
EndSub
----当然对微软提供的标准控件能采用该方法添加 , 大家都不会怀疑 , 但自己开发的
控件也能吗?答案是肯定的,我们可以用一个实际的例子进行说明 。
vb 动态添加 按钮/事件可以考虑按钮数组,即新加的按钮与已存在的按钮name相同,仅具有不同的index,那么这一组按钮的相同事件都可以在同一个过程中实现,借由这个过程的index参数来区别用户单击的是哪个按钮 。举个例子:
两个按钮都叫做command1 , index分别为0和1
index为0 的按钮的caption为“按钮1”
index为1 的按钮的caption为“按钮2”
双击其中之一可添加代码:
if index = 0 then
msgbox "你单击了按钮1"
else
msgbox "单击了按钮2"、
end if
这样新加了按钮之后,照样用已经存在的过程来处理单击事件 。
vb.net 动态生成的控件,事件也动态加,怎么做呢?你需要的应该是反射vb.net动态按钮事件,类似如下,我测试通过的vb.net动态按钮事件:
Imports System.Reflection
Public Class Form1
Public Sub MMMToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MMMToolStripMenuItem.Click
MsgBox("menu click")
End Sub
'在按钮事件处理里面通过反射名称调用相应菜单事件
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
'动态生成了按钮
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.net 动态菜单click事件先要新建一个index为0的菜单(设置为不可见),然后把动态生产的菜单加入进来,这样就可以使用遍历菜单的方法,并判读下当前按下的菜单名称 。
参看:网页链接
怎样指定一个动态增加按钮的事件(vb.net)''' summary
''' 添加多个按钮到一个容器中.
''' /summary
''' param name="StartPos"所有按钮开始点./param
''' param name="ButtonSize"按钮的大小./param
''' param name="ButtonSpace"按钮的间距/param
''' param name="ButtonCount"按钮的总数/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.HeightButtonSize.Height
If mBtnPos.YAddingContainer.Height Then
mBtnPos.Y = StartPos.Y
mBtnPos.X= ButtonSpace.WidthButtonSize.Width
End If
NewButton.Text = String.Format(":", CStr(ItemTemp1))
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("您输入的数字无法解析为数字.")
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
vb.net定义动态控件事件给你个例子就知道vb.net动态按钮事件了
Public Class Form1
'演示为动态添加vb.net动态按钮事件的控件添加事件
Private WithEvents Tb As New TextBox '方法2必须这样写
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Dim Tb As New TextBox
Tb.Name = "Textbox1"
Tb.Text = "文本框1"
Controls.Add(Tb)
AddHandler Tb.KeyPress, AddressOf XX '方法1vb.net动态按钮事件,移动鼠标触发
End Sub
Private Sub XX()
MsgBox("AddHandler方法")
End Sub
Private Sub ShowClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tb.Click '方法2 , 单击触发
MsgBox("Handles方法,你点击了"sender.name)
End Sub
End Class
关于vb.net动态按钮事件和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读