2

ダブルクリック イベントでツリービューの選択されたノードに応じて、特定のフォームを起動しようとしています。新しいインスタンスを起動する前に、フォームが破棄されていないこと、およびフォームがまだ開いていないことを確認する必要があるため、フォームを起動するために使用する必要があるコードは少しかさばります。このすべてのチェックを関数の最後の 1 か所で実行したいと考えています。つまり、正しいフォーム タイプをコードの最後に渡せるようにする必要があります。System.Type でこれを実行しようとしていますが、うまくいかないようです。誰かが私を正しい方向に向けてもらえますか?

    With TreeView.SelectedNode
        Dim formType As Type
        Select Case .Text
            Case "Email to VPs"
                formType = EmailForm.GetType()
            Case "Revise Replacers"
                formType = DedicatedReplacerForm.GetType()
            Case "Start Email"
                formType = EmailForm.GetType()
        End Select
        Dim form As formType
         Dim form As formType
        Try
            form = CType(.Tag, formType)
            If Not form.IsDisposed Then
                form.Activate()
                Exit Sub
            End If
        Catch ex As NullReferenceException
            'This will error out the first time it is run as the form has not yet 
            ' been defined.
        End Try
        form = New formType
        form.MdiParent = Me
        .Tag = form
        CType(TreeView.SelectedNode.Tag, Form).Show()
    End With
4

1 に答える 1

1

newタイプはできません。Type は実行時の型情報であり、newコンパイル時に型を知る必要があります。

リフレクション (アクティベーター) またはジェネリックのいずれかを使用します。

申し訳ありませんが、私は VB を知りません。VB でのコード例を示すことはできません。

c# の例:

T CreateForm<T>() where T : Form, new()
{
  return new T();
}

また

Form CreateForm(Type t)
{
  return (Form)Activator.CreateInstance(t);
}
于 2010-06-07T16:55:08.150 に答える