我有名为TopicBar的第三方控件,它看起来像窗口左侧的窗口xp导航栏
在我的应用程序中,我创建了一个数据库表来存储我的所有表单Name
和Text
,一个部分用户可以添加哪些表单(通过搜索表单'我已经存储在表格中的名称应该在主题栏中添加为项目。
例如,一个名为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 &"
答案 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可能性的更多信息。