VB 2010表格秀

时间:2014-12-22 03:51:11

标签: vb.net forms visual-studio

我目前有多种形式(大约30种形式),我在表单之间切换。主窗体(Form1)有29个按钮,每个按钮将带我到相应的窗体编号(例如:button3 = form3,button20 = form20等)。

我知道我可以使用代码:

me.hide
form1.show

我想要一种方法来动态传递表单名称,其中包括:

me.controls(FormName).show

这可能吗?

3 个答案:

答案 0 :(得分:0)

使用三种表单(Form1,Form2和Form3)创建一个新项目。在Form1上放两个按钮(名为Button2和Button3),然后将以下源代码放在Form1中:

Option Strict On

Public Class Form1

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Call FormFromButton(DirectCast(sender, Button))
  End Sub

  Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Call FormFromButton(DirectCast(sender, Button))
  End Sub

  Public Sub FormFromButton(btn As Button)
    Dim i As Integer = CInt(btn.Name.Substring(6)) 'Get number after "button" (6 characters)
    Dim f As Form = GetForm("Form" & i.ToString)
    f.Show()
    f.Activate()
  End Sub

  Public Function GetForm(formClassName As String) As Form
    'see if it is already instanced
    For Each f As Form In My.Application.OpenForms
      If f.GetType.Name = formClassName Then Return f
    Next f
    'create new instance
    Dim strFullName As String = Me.GetType.Namespace & "." & formClassName
    Dim o As Object = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(strFullName)
    Dim frm As Form = DirectCast(o, Form)
    Return frm
  End Function

End Class

答案 1 :(得分:0)

我自己创建了4个表格,一个是父母另一个3(表格3,表格4,表格5)是孩子,我在父表单中创建了3个按钮,该按钮文本是表格3,表格4,表格5

Imports System
Imports System.Reflection
Public Class Form2
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each ctrl As Control In Me.Controls
            If TypeOf ctrl Is Button Then
                Dim btn As Button
                btn = DirectCast(ctrl, Button)
                AddHandler btn.Click, AddressOf Me.buttonclick
            End If
        Next
    End Sub
    Private Sub buttonclick(sender As Object, e As EventArgs)
        Dim frmname As Button = DirectCast(sender, Button)
        Dim frmAssembly As Assembly = Assembly.LoadFile(Application.ExecutablePath)
        For Each type As Type In frmAssembly.GetTypes
            If type.BaseType = GetType(Form) Then
                If (type.Name = frmname.Text) Then
                    Dim frmshow As Form = DirectCast(frmAssembly.CreateInstance(type.ToString()), Form)
                    For Each frm As Form In Me.MdiChildren
                        frm.Close()
                    Next
                    frmshow.Show()
                End If
            End If
        Next
    End Sub
End Class

答案 2 :(得分:0)

Private Sub ButtonClick(ByVal sender As Object, e As System.EventArgs)
    Dim btn As Button = DirectCast(sender, Button)
    Dim formname As String = "form" & btn.Name(btn.Name.Length - 1)
    Dim frm As Form = GetForm(formname)
    frm.Show()
End Sub
Private Function GetForm(ByVal Formname As String) As Form
    Dim t As Type = Type.GetType(Formname) ', True, True)
    If t Is Nothing Then
        Dim Fullname As String = Application.ProductName & "." & Formname
        t = Type.GetType(Fullname, True, True)
    End If
    Return CType(Activator.CreateInstance(t), Form)
End Function
Private Sub AddHandlers()
    AddHandler Button1.Click, AddressOf ButtonClick
    AddHandler Button2.Click, AddressOf ButtonClick
    AddHandler Button3.Click, AddressOf ButtonClick
    AddHandler Button4.Click, AddressOf ButtonClick
End Sub
Private Sub RemoveHandlers()
    RemoveHandler Button1.Click, AddressOf ButtonClick
    RemoveHandler Button2.Click, AddressOf ButtonClick
    RemoveHandler Button3.Click, AddressOf ButtonClick
    RemoveHandler Button4.Click, AddressOf ButtonClick
End Sub
Private Sub Form2_Activated(sender As Object, e As System.EventArgs) Handles Me.Activated
    AddHandlers()
End Sub
Private Sub Form2_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    RemoveHandlers()
End Sub