动态打开表单

时间:2015-10-28 12:21:52

标签: vb.net forms

我有名为TopicBar的第三方控件,它看起来像窗口左侧的窗口xp导航栏

在我的应用程序中,我创建了一个数据库表来存储我的所有表单NameText,一个部分用户可以添加哪些表单(通过搜索表单'我已经存储在表格中的名称应该在主题栏中添加为项目。

例如,一个名为FrmBill的表单,其名称为Bill,一旦用户将Bill添加到Topicbar,它将成功创建名为Bill的项目。现在我面临的是我需要打开表单FrmBill用户点击主题栏中的Bill项目

我可以获取表单名称,即FrmBill是用户点击Bill而我无法打开表单,因为我需要动态创建实例或在此处调用表单frmBill

到目前为止我做了什么

 Dim formName As String
    Dim frm As Form

Using conn As New SqlConnection(conn_str)
    conn.Open()
    Dim cmd As SqlCommand
    cmd = New SqlCommand("", conn)
    cmd.CommandText = "select top 1 formname from winforms where id=" & winformid & ""
    formName = cmd.ExecuteScalar
    'output: FrmBill
    frm = New Form
    frm.Name = formName '(FrmBill)

    With frm
        .MdiParent = FrmMain
        .Show()
        .Focus()
    End With

End Using

注意:在此函数中,我可以从数据库中获取表单名称FrmBill,但它不显示实际表单FrmBill

因此,无论如何都要声明表单名称,如下所示

dim frm as new "& formname &"

1 个答案:

答案 0 :(得分:1)

这不像“昏暗的新品”和“新品”那么容易。 formname&“”,但可以这样做:

Dim frmNewForm As Form = Nothing
Dim frmNewForm_Type As Type = Type.GetType("your_assembly.type_name")
frmNewForm = CType(Activator.CreateInstance(frmNewForm_Type), Form)

我的意思是,你必须存储班级表格的类型。

修改

您可以打开表单:

Dim oFr as New frmBill
oFr.Show()

好吗?好。您可以打开一个表格:

 Dim oFr as Form 
 oFr = New frmBill ' Because frmBill inherits System.Windows.Forms.Form class. All forms do it
 oFr.Show()

这里,frmBill是类的类型。你没有frmBill显式引用,所以你必须以dinamically方式加载它。

怎么办?使用名为Reflection的“NET机制”。您可以使用dinamically创建一个类,指定类Type。

Dim frmNewForm As Form = Nothing
Dim frmNewForm_Type As Type = Type.GetType("project_name.frmBill")
frmNewForm = CType(Activator.CreateInstance(frmNewForm_Type), Form)

Plutonix说什么?假设你在frmBill中有一个公共的“打印”方法 根据我的回答,你不能这样做:

frmNewForm.print()

因为您只能访问System.Windows.Forms.Form方法(close,show,showdialog ...)

您可以根据需要使用自定义基类或使用Interfaces或基本抽象类来改进这一点。根据您的需要,您可以结合不同的想法。例如,您可以将Interface与Superclass结合使用:

public class frmMyForms
   inherits System.Windows.Forms.Form 

   public sub store_data ()  

....

public interface IInterface_common_methods

 sub print ()

...

public class frmBill
   inherits frmMyForms
   implements IInterface_common_methods

   public overloads sub store_data ()  
     msgbox ("store")
   end sub

 public sub print  ()  implements IInterface_common_methods.print
     msgbox ("print")
   end sub

现在,您可以执行以下操作:

Dim frmNewForm As frmMyForms= Nothing
Dim frmNewForm_Type As Type = Type.GetType("project_name.frmBill")
frmNewForm = CType(Activator.CreateInstance(frmNewForm_Type), frmMyForms)       

frmNewForm.Show()
frmNewForm.store_data() 
ctype(frmNewForm, IInterface_common_methods).Print() 

我不知道这是否是您正在寻找的,但我希望这可以帮助您了解有关NET可能性的更多信息。