如何从数据库加载 Windows 窗体






1.19/5 (14投票s)
如何从数据库加载 Windows 窗体
如何从数据库加载 Windows 窗体
有时我们希望将窗体名称保存在数据库中,并使用保存的名称加载窗体。我们该如何实现这个任务?在 2005 年,有一个名为“System.Reflection”的命名空间,这个命名空间支持动态创建类型。
Private Function LoadFormFromDataBase(ByVal FormName As String) As Object 1 Dim oRetForm As Object = Nothing 2 3 Dim oType As Type = 4 Assembly.GetExecutingAssembly().GetType("MyProject." & FormName) 5 6 If oType IsNot Nothing Then 7 oRetForm = Activator.CreateInstance(oType) 8 End If 9 10 Return oRetForm 11 End Function
这个函数有一个参数,即窗体名称。在第 3 行和第 5 行,你可以看到我们的窗体名称(我们传递给函数的参数)在内存中动态组装。对于这个实例,有一件非常重要的事情,那就是你的项目,你的窗体包含在哪个项目中。另外一件非常、非常重要的事情是项目名称后的“.”。这是分隔项目名称和窗体名称的分隔符。
所以现在我们要在内存中实现这个实例(或者你也可以远程创建它)。这个任务由 Activator 类使用 CreateInstance 方法在第 7 行完成。CreateInstance 方法有 14 个参数,但对于这个任务,我们只传递对象类型。
所以现在你已经将窗体存储在你的对象类型变量 (oRetForm) 中,你可以使用这种方法加载其他控件。
评估
好的,我收到了一些朋友的评论,首先我想感谢大家的所有评论。实际上,这个 Windows 窗体并没有保存在你的数据库中,数据库中包含的是你的窗体名称(请记住,不是窗体文本)。那么我们为什么要这样做呢?
好的,你有一个树节点,从数据库动态加载(节点名称、根节点等)。所以当你点击该节点时,你需要打开一个窗体。为此,你有两个选择:一是获取节点名称并加载窗体,为此你需要硬编码你的窗体名称,如下所示:
Private Sub treMain_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles treMain.AfterSelect With e.Node If .Name = "A" Then Dim OfrmA As New frmA frmA.Show() ElseIf .Name = "B" Then Dim OfrmB As New frmB OfrmB.Show() ElseIf .Name = "C" Then Dim OfrmC As New frmC OfrmC.Show() ElseIf .Name = "D" Then Dim OfrmD As New frmD OfrmD.Show() ElseIf .Name = "E" Then Dim OfrmE As New frmE OfrmE.Show() ElseIf .Name = "F" Then Dim OfrmF As New frmF OfrmF.Show() ElseIf .Name = "G" Then Dim OfrmG As New frmG OfrmF.Show() End If End With End Sub
另一种方法是在你的节点表中创建一个额外的列来包含该节点的窗体名称。因此,当你加载该树节点时,你可以将窗体名称添加到树节点名称中。现在你的窗体名称就在你的树视图的节点名称中了。
现在只需使用这段代码:
Private Sub treMain_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles treMain.AfterSelect Dim frmUnLoad As New Form frmLoad = LoadFormFromDataBase(e.Node.Name) End Sub Private Function LoadFormFromDataBase(ByVal objectName As String) As Object Dim returnObj As Object = Nothing Dim type As Type = Assembly.GetExecutingAssembly().GetType("UserInterface." & objectName) If type IsNot Nothing Then returnObj = Activator.CreateInstance(type) End If Return returnObj End Function
就这样。现在你可以在点击节点时加载你的窗体。
所以如果你想编辑你的代码,如果想添加新的窗体并为解决方案添加新的节点,则不需要这样做,只需创建一个窗体并将其添加到你的解决方案中,然后在你的节点表中添加一条记录,其中包含该窗体的名称即可。
哪个解决方案更好?决定权在你。