printmedia
asked on
Open form based on TreeView Selection visual studio
Hi all.
I'm working on a vb.net project in Visual Studio. The "Menu" form has a TreeView control. When the end user clicks a node then I want to open the form that corresponds to the selected node. All of the forms are within the same project. I'm basically trying to make the treeview work as a menu or switchboard.
The problem is that there could be 50 to 60 nodes and I'd like to avoid having to do 50-60 case statements or if else statements to open the forms.
So I was working on the code below but I'm getting the following error because I can't cast from a string to a form, so can someone provide any suggestions as to how I can get this to work?
Thank you in advance!
ERROR: Unable to cast object of type 'System.String' to type 'System.Windows.Forms.Form '.
Code:
I'm working on a vb.net project in Visual Studio. The "Menu" form has a TreeView control. When the end user clicks a node then I want to open the form that corresponds to the selected node. All of the forms are within the same project. I'm basically trying to make the treeview work as a menu or switchboard.
The problem is that there could be 50 to 60 nodes and I'd like to avoid having to do 50-60 case statements or if else statements to open the forms.
So I was working on the code below but I'm getting the following error because I can't cast from a string to a form, so can someone provide any suggestions as to how I can get this to work?
Thank you in advance!
ERROR: Unable to cast object of type 'System.String' to type 'System.Windows.Forms.Form
Code:
Private Sub TreeView1_AfterSelect(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterSelect
Dim con As New SqlConnection
Dim cmd As New SqlCommand
Dim frm As New Form
con.ConnectionString = "Data Source=myServer;Initial Catalog=myDB;Integrated Security=True"
con.Open()
cmd.Connection = con
If e.Node.Text = "PM App" Then
Exit Sub
Else
cmd.CommandText = "SELECT FormName FROM Menu WHERE Application = @Form"
cmd.Parameters.AddWithValue("@Form", TreeView1.SelectedNode.Text)
frm = cmd.ExecuteScalar()
frm.Show()
con.Close()
End If
End Sub
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Type.GetType(String, Boolean), attempts to Get the Type specified by the Name, performing a case-sensitive search and specifying whether to throw and exception if the type is not found.
Type.GetType(String, Boolean, Boolean), does the exact same thing as the previous with the difference being that you can control the search case-sensitivity.
You have noticed that Eric switches from throwing no exception to throwing an exception.
As for the last line, you have to create an instance of the type, Eric has specified to create an instance using the empty constructor. This is the same thing as perfoming either of the following:
-saige-
Type.GetType(String, Boolean, Boolean), does the exact same thing as the previous with the difference being that you can control the search case-sensitivity.
You have noticed that Eric switches from throwing no exception to throwing an exception.
As for the last line, you have to create an instance of the type, Eric has specified to create an instance using the empty constructor. This is the same thing as perfoming either of the following:
Dim f1 As Form = New Form()
'' Or
Dim f1 As New Form()
-saige-
you should first have a look at https://msdn.microsoft.com/en-us/library/c5cf8k43(v=vs.110).aspx
Type.GetType tries to create a type form the name specified in the string. The False value is just to prevent an exception to be thrown because we are checking on the following if the Type is null (meaning not found).
Because forms belongs to namespaces in .Net, we are trying to add the current namespace to the form name in also use the 3rd argument to specify to do a case-insensitive operation.
The last line cast the returned type to a form.
Type.GetType tries to create a type form the name specified in the string. The False value is just to prevent an exception to be thrown because we are checking on the following if the Type is null (meaning not found).
Because forms belongs to namespaces in .Net, we are trying to add the current namespace to the form name in also use the 3rd argument to specify to do a case-insensitive operation.
The last line cast the returned type to a form.
ASKER
Thank you!
ASKER
I'd like to understand the code, so I have a couple of questions:
(1) What does the Type.GetType(pFormName, False) do exactly because testing the code out, it actually goes into the If statement . Is it checking to see if pFormName is of any known object type (i.e. String, Form, ListBox etc.). If it can't find it then the "False" part means do not throw an exception and just continue on to the If statement?
(2) In the line T = Type.GetType(strFullname, True, True), is the first "True" to throw an exception and the second to do a case-sensitive search?
(3) In the last line, CType is converting T to a new Form instance?