Visual Basic 6.0 控件和 .NET 控件的区别(二)
翻译|其它|编辑:郝浩|2006-05-15 15:23:00.000|阅读
1493 次
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
常规控件的变化
与 Visual Basic 6.0 相比,.NET 中控件的工作方式发生了很大变化。以下九节介绍了其中一些变化,并介绍了这些变化对您在 .NET 中的开发工作的影响。
.NET 控件的创建
与 Visual Basic 6.0 相比,.NET 最大的变化之一是窗体上的实例化控件的代码现在变为可见,以前所有这些代码都隐藏在 ActiveX 控件内部和 Visual Basic 运行时中。现在,展开窗体后面的代码中的 #Region 部分即可查看代码。下面是一个窗体示例,包含一个标签、一个文本框和一个按钮控件。
Public Class frmTest
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'Windows 窗体设计器必需此调用。
InitializeComponent()
'调用 InitializeComponent() 后添加初始化。
End Sub
'窗体覆盖配置以清除组件列表。Protected Overloads Overrides Sub Dispose
(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Button1 As System.Windows.Forms.Button
'Windows 窗体设计器所必需。
Private components As System.ComponentModel.Container
'注意:以下步骤是 Windows 窗体设计器所必需的。
'可以使用 Windows 窗体设计器对其进行修改。'请勿使用代码编辑器进行修改。
Private Sub
InitializeComponent()
Me.Label1 = New System.Windows.Forms.Label()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.Button1 = New System.Windows.Forms.Button()
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Name = "Label1"
Me.Label1.TabIndex = 0
Me.Label1.Text = "Label1"
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(8, 80)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.TabIndex = 1
Me.TextBox1.Text = "TextBox1"
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(112, 32)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 2
Me.Button1.Text = "Button1"
'
'frmTest
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(392, 250)
Me.Controls.AddRange(New System.Windows.Forms.Control()
{Me.Button1, Me.TextBox1, Me.Label1})
Me.HelpButton = True
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "frmTest"
Me.Text = "frmTest"
Me.ResumeLayout(False)
End Sub
#End Region
End Class
可以看出,每个控件都是先创建,然后再对属性(如 Location 和 Size)进行初始化。在 Visual Studio 设计器的“属性”窗口中设置的任何其他属性也将作为代码添加到此处。如果愿意,您可以仅使用“记事本”来设计用户界面!
注意:请勿更改 #Region 区域中的任何代码。当您在窗体中添加或删除控件时,此部分代码将由 Visual Studio 环境自动创建和销毁。
锚定
象很多 Visual Basic 开发人员一样,您肯定曾经多次通过编写代码将控件锚定在窗体的右下边。如果您希望用户能够调整窗体大小,但又希望窗体上的某些控件相对于窗体底部和/或右边总是保持位置不变,可以不用编写代码!Visual Studio .NET 提供了一个简单的解决方案:即利用 Anchor 属性。该属性使您可以将控件锚定在容器的任一边或所有边。如果锚定在底部和/或右边,当您调整窗体大小时,控件将呈漂浮状;如果锚定在顶部和/或左边,当您调整窗体大小时,控件的大小也将随之改变。您需要实际操作一下,以了解该属性对控件的影响。
图 1:典型的数据输入屏幕
如图 1 所示,在用键盘键入数据的输入窗体上,您可能希望使 Add、Update、Delete 和 Clear 按钮保持在窗体的右下角。要实现此目的,请突出显示这些按钮,然后将 Anchor 属性设置为 BottomRight。要执行此操作,请在 Properties 窗口中找到 Anchor 属性,并单击其下拉箭头。清除选择左边和上边的栏,然后选择右边和下边的栏,如图 2 所示。
图 2:已激活 Anchor 下拉列表的 Properties 对话框
使用 Anchor 属性,您不必编写任何代码行就能将控件锚定在窗体的任何边。通过选择图形化菜单中的选项,您可以选择所需的操作。在代码中,可以使用诸如 TopLeft、BottomRight、Left、Right、Top、Bottom、TopLeftBottom 和 All 等常量来设置属性值。
靠接
Dock 属性类似于 Anchor 属性,使您可以将控件靠接到容器的任何边。靠接控件时,控件将随窗体的缩放而缩放,但其靠接的边保持不变,如果将控件靠接在窗体的所有边,则控件将充满整个窗体。
关于控件数组
在 Visual Basic 6.0 中,将所有控件的 Name 属性设置为相同的值便可以创建控件数组。随后,每个控件的 Index 属性会被设置为不同的编号。Index 值被传递给该组控件的任意事件,这样您就可以知道哪个控件调用了该事件。这是 Visual Basic 6.0 中控件数组的用途之一,即一个事件过程处理多个控件的代码。
而在 Visual Basic .NET 中,处理控件数组的方式则大不一样。实现一个过程处理多个控件的事件的方法有两种:使用内嵌于 .NET 类中的 AddHandler 过程,或在过程中使用 Handles 子句。
如果您只希望编写一个 Click 事件,使窗体底部的所有按钮都具备该事件,您可以双击其中一个按钮,使代码窗口生成一个 Click 事件过程。此过程的代码如下:
Private Sub btnSave_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles btnSave.Click, btnNew.Click, btnDelete.Click
MessageBox.Show("Click 事件")
End Sub
尽管以上代码很简单,但它说明了不同控件如何调用同一过程。除了创建控件数组,您还可以通过创建并指定事件处理程序来响应多个控件的一个或多个事件。
除了 Handles 子句,您还可以使用 AddHandler 语句实现一个过程处理多个控件的事件。该语句使您可以向任何事件添加事件处理程序,并指定要调用的过程。由于可以向事件添加事件处理程序,您可以使用一系列事件处理程序来处理相同的事件,实际上是在告诉控件应该调用哪个过程来响应事件。因为是委托事件处理程序来处理这一新过程,所以此过程称为“代理”。
要使代理生效,请在窗体的 New 方法中现有代码的 TODO 注释下面添加类似下面的代码:
AddHandler btnDelete.Click, AddressOf ButtonClick
AddHandler btnNew.Click, AddressOf ButtonClick
完成上述代码的添加后,如果单击 New、Delete、或 Save 按钮,则会调用 ButtonClick 事件过程。当然,您可能需要确定调用此特殊事件过程的按钮。要做到这一点,您可以使用传递给所有事件过程的 sender 参数,它是产生该特殊事件的对象。因此您可以编写如下代码:
Private Sub ButtonClick( _
ByVal sender As Object, _
ByVal e As System.EventArgs)
If sender Is btnNew Then
MessageBox.Show("已按下 New 按钮")
ElseIf sender Is btnSave Then
MessageBox.Show("已按下 Save 按钮")
ElseIf sender Is btnDelete Then
MessageBox.Show("已按下 Delete 按钮")
End If
End Sub
这两种创建数组的方法没有本质区别,您可以任意选择一种。
标签:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com