扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年10月2日
关键字: Visual Basic .NET 编程
在本页阅读全文(共2页)
典型的方案
假设我们有一个多文档界面 (MDI) 应用程序,需要具有将任意窗体加载为子窗体的能力。那么应用程序应该能够执行以下操作:
让我们编写这样一个应用程序,看看如何完成动态加载。
步骤 1:创建项目和 MDI 窗体
启动一个新的 Windows 窗体项目。将其命名为 FormsOnTheFly。在新项目中包含的空窗体 Form1 中,将它的 IsMdiContainer 属性更改为 True。这样,该窗体即变成一个 MDI 父窗体。更改窗体的大小,使窗体的长和宽的尺寸大约为默认值的两倍。
将一个面板控件拖动到窗体上,然后设置它的 Dock 属性,使它靠接在窗体的顶部。更改面板的大小,使它的高度大约为 0.5 英寸。
将一个组合框拖动到面板上。将它命名为 cboForms,然后将它的 DropDownStyle 设置为 DropDownList。
最后,将一个按钮拖动到面板上。将它命名为 btnLoadForm,然后将它的 Text 属性设置为 Load Form。
此时,Form1 应如图 1 所示。
图 1:添加所有控件后处于设计模式下的 MDI 窗体
步骤 2:生成一个类,以存放可用窗体的数据
我们将获取可能从基于 XML 的配置文件之外加载的窗体的有关信息。但是,为了更便于在组合框中显示可用窗体并获取有关所选窗体的信息,还应建立一个对象集合。集合中的每个对象都将存放一个可用窗体的信息。对象应具有以下属性:
这样的集合可以数据绑定到列表框中。要从列表框中返回对所选对象的引用,还需要一个属性,我们称之为 Reference。
要创建类,请选择 Project | Add Class(项目|添加类),然后将类命名为 DynamicClass.vb。在类中添加以下代码:
Public Class DynamicClass Dim msLocation As String Public Sub New(ByVal sLocation As String, _ Public Property Location() As String Public Property Type() As String Public Property Description() As String Public ReadOnly Property Reference() As Object |
应用程序在运行时需要的某些信息可能在编译时无法提供,这些信息通常放置在配置文件中。在 Visual Basic 6.0 中,配置文件应该是 INI 文件或 Windows 注册表。而在 .NET 中,则使用基于 XML 的配置文件。
我们无法详细介绍配置文件,因为这个主题非常复杂。但是,您应该知道,Windows 窗体应用程序的配置文件与应用程序的 EXE 启动文件在同一个目录中。配置文件的名称与程序的 EXE 启动文件的名称相同,只不过在 EXE 文件名后添加了后缀 .config。这就是说,如果执行 MyApp.exe 程序可启动我的应用程序,则配置文件的名称一定是 MyApp.exe.config,而且配置文件必须与 MyApp.exe 位于同一个目录中。
以下是示例中要使用的配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="availableclasses" type="System.Configuration.NameValueSectionHandler" /> </configSections> <availableclasses> <add key="Placeholder ? do not load" value="DLLPathnameGoesHere~NameOfTypeGoesHere"></add> </availableclasses> </configuration> |
此处,<availableclasses>
标记是占位符信息,便于人们看清格式。稍后,我们还会再返回来,为创建的新窗体添加配置信息。
这实际上并不是存放窗体配置信息的理想方式,因为我们用符号分隔的方式在同一位置保存 DLL 位置和类型名称。但是,使用高级方法分别存放这些信息会要求相当多的注释和代码,所以我们暂且使用这种替代方法。
使用某些文本编辑器或 XML 编辑器(或 Microsoft Visual Studio®)创建上述配置文件,然后使用 FormsOnTheFly.exe.config 文件名将其保存在 FormsOnTheFly 项目的 \bin 目录下。因为 .NET 配置类使用区分大小写的 XML 标记,所以创建此文件时,请注意 XML 标记中字母的大小写。
步骤 4:将配置信息读入集合中
我们为窗体编写的代码将使用 System.Configuration 和 System.Reflection 命名空间中的类。请将以下两行代码置于 Form1 代码的最顶端,以便更方便地访问这些类:
Imports System.Configuration
Imports System.Reflection
还需要一个模块级变量来存放配置信息集合。请将以下代码行紧挨着 Inherits System.Windows.Forms.Form
代码行放在其下方:
Dim colAvailableClasses As ArrayList
现在,可以编写核心代码了。在 Form1 的 Form Load 事件中放置以下代码,以便读取配置文件、创建存放信息的对象集合以及将集合数据绑定到组合框:
' 实例化配置信息集合。 colAvailableClasses = New ArrayList() ' 获取要从配置文件中加载的可用项。 Dim iIndex As Integer ' 创建可绑定到组合框的可用项的' 集合。 ' 经过简单的处理,从一个字段中' 获取位置和类型。 Dim objNewForm As New DynamicClass(sLocation, sDescription, sType) ' 现在,将集合绑定到组合框。' 显示说明,并返回对象的引用。 |
现在,在 btnLoadForm 的 click 事件中放置以下逻辑:
Dim objFormToLoad As DynamicClass objFormToLoad = cboForms.SelectedValue Dim asmAssemblyContainingForm As [Assembly] = _ Dim FormToShow As Form = CType(GenericInstance, Form) |
这是程序的核心部分。通过使用集合中一个对象的信息实例化代码并显示窗体。让我们逐行说明这段代码。
首先我们引用了其中包含要加载窗体的位置和类型的对象 (objFormToLoad)。它被设置为组合框的 SelectedValue 属性,在从数据绑定的组合框返回所选内容时使用。
DLL 的位置包含在对象的 Location 属性中。Assembly 类的 LoadForm 方法使用该属性创建对程序集的引用。(将 Assembly 类置于括号中是因为 Assembly 是 .NET 关键字。括号将通知编译器,其中的内容不是正在使用的关键字,而是类名。)
下面,我们需要引用正在加载的 .NET 类型(类)。可以使用程序集的 GetType 方法,通过传递存放类型名称(该类型名称将从存放配置数据的对象的 Type 属性中获取)的字符串进行引用。对类型的引用保存在 TypeToLoad 中。
Reflection 类和 Activator 类使用它们的 CreateInstance 方法创建类型的实例。(CreateInstance 与 Visual Basic 6.0 中的 CreateObject 类似。)但是,实例必须是类型对象,因为该类型要动态加载。
最后,新实例化的对象(实际上是一个窗体)必须转换为正确的类型才能启用前期绑定。我们知道它是一个窗体,所以可以使用 CType 函数将其转换为窗体。
最后,将新窗体设置为 MDI 父窗体的子窗体并对其进行显示。注意:从 Death of the Browser?(英文)所示的 URL 处加载的程序集被复制到本地缓存中。
从 UNC 加载的程序集(如本文中的程序集)仅在当前位置使用,不被复制到任何缓存中。
步骤 6:编译应用程序
现在,我们可以编译应用程序,但由于尚未创建任何窗体,所以不会显示任何窗体。可以编译并运行程序,确保它能够工作并确保组合框能够正确加载占位符项。如果单击 btnLoadForm,则会显示错误信息或教程,因为配置文件中的信息还未指向任何对象。
步骤 7:创建要显示的窗体
现在,开始创建名为 FirstForm 的新的 Windows 窗体应用程序。在出现的空白 Form1 上放置一些控件 - 控件类型不限。
然后在 Solution Explorer(解决方案资源管理器)中的 FirstForms 项目上单击鼠标右键,选择 Properties(属性)。在 Output Type(输出类型)组合框中选择 Class Library(类库)。如果未看到组合框,可以在 Solution Explorer(解决方案资源管理器)的 Solution(解决方案),而不是 Project(项目)上单击鼠标右键。
现在开始创建项目。即创建一个包含该窗体的 DLL。
创建一个名为 C:\NewForms 的目录。将 FirstForms.dll 从 FirstForms 的 \bin 目录复制到 C:\NewForms 中。
对名为 SecondForm 和 ThirdForm 的项目重复上述操作。在每个窗体中拖入不同的控件以便于区分。也可以将每个窗体的背景色更改为独特的颜色。
步骤 8:用新的窗体信息更新配置文件
现在,我们已经创建了一些新窗体,还需要在配置文件中引用它们。请用以下代码行替换 FormsOnTheFly.exe.config 中的占位符信息:
<add key="First Form" value="C:\NewForms\FirstForm.dll~FirstForm.Form1"></add> <add key="Second Form" value="C:\NewForms\SecondForm.dll~SecondForm.Form1"></add> <add key="Third Form" value="C:\NewForms\ThirdForm.dll~ThirdForm.Form1"></add> |
如果要更改窗体的位置或名称,则需要对以上代码行进行相应修改。
步骤 9:运行 FormsOnTheFly.exe 并加载窗体
现在执行 FormsOnTheFly.exe(不加载 Visual Studio)。选择组合框中的一个窗体,然后单击 btnLoadForm。如果正确完成了所有步骤,则可以看到子窗体加载到 MDI 窗口中(即使编译 MDI 应用程序时子窗体并不存在)。
图 2 显示了动态加载窗体后的 MDI 窗体。
图 2:动态加载窗体后的 MDI 窗体
此时,您可以根据需要创建任意多个新窗体并将其加载到 MDI 应用程序中。要使其可用,请将其编译为类库,然后在配置文件中添加对它们的引用。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。