65.9K
CodeProject 正在变化。 阅读更多。
Home

如何从数据库加载 Windows 窗体

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.19/5 (14投票s)

2008年2月26日

CPOL

2分钟阅读

viewsIcon

47020

如何从数据库加载 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

就这样。现在你可以在点击节点时加载你的窗体。

所以如果你想编辑你的代码,如果想添加新的窗体并为解决方案添加新的节点,则不需要这样做,只需创建一个窗体并将其添加到你的解决方案中,然后在你的节点表中添加一条记录,其中包含该窗体的名称即可。

哪个解决方案更好?决定权在你。

© . All rights reserved.