首先我们引用了其中包含要加载窗体的位置和类型的对象 (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 应用程序中。要使其可用,请将其编译为类库,然后在配置文件中添加对它们的引用。