Peter Allen
asked on
Create new Instance of a Form by String Name
Experts,
I have a Form which has several components making up the UI. The Form contains the following controls:
SplitContainer1 with Panel1 and Panel2
Panel1 has a ToolStrip for the Buttons I have
Panel2 of the SplitContainer has two Panel controls (One called Form and the other called Data)
When I click on the buttons in the ToolStrip I want the desired Form to load in Form Panel using a string name I provide which matches the Form Name. The name of the form is placed in a Public Property defined as a string; p_sPanelFormName..
Panel Form will switch between the various Forms showing what I want with results placed in the Panel Data as needed. I have the attached VB.NET code which appears to do what I want, but I get the error, "Object reference not set to an instance of an object.
Help please... Thank you.
Code executed to update Panel Form with the new Form with its name stored in p_sPanelFormName:
Dim f_PanelForm As Form = oclsObjects.fncCreateForm( (p_sPanelF ormName))
f_PanelForm.TopLevel = False
f_PanelForm.Parent = Me
Panel_Form.Controls.Add(f_ PanelForm)
f_PanelForm.Show()
--------------------
Class containing Function to create the new instance of the Form I was to display in the Panel Form:
Imports System
Imports System.Windows.Forms
Imports System.Reflection
Public Class clsMod_CreateObjects
'01.00.000 04/06/2012 04/06/2012 Initial release of this Function
Public Function fncCreateObjectInstance(By Val objectName As String) As Object
' Creates and returns an instance of any object in the assembly by its type name.
Dim obj As Object
Try
If objectName.LastIndexOf("." ) = -1 Then
'Appends the root namespace if not specified.objectName = [Assembly].GetEntryAssembl y.GetName. Name & "." & objectName
End If
obj = [Assembly].GetEntryAssembl y.CreateIn stance(obj ectName)
Catch ex As Exception
obj = Nothing
End Try
Return obj
End Function
'01.00.000 04/06/2012 04/06/2012 Initial release of this Function
Public Function fncCreateForm(ByVal formName As String) As Form
' Return the instance of the form by specifying its name.
Return DirectCast(fncCreateObject Instance(f ormName), Form)
End Function
End Class
-------------------------- --
According to the first part of code I am not creating a new instance of the Form from the Public Property string. I am not sure how to go about this. Also, I need to update my code to show the proper Panel Form to the user which is contained in SplitContainer.
I have a Form which has several components making up the UI. The Form contains the following controls:
SplitContainer1 with Panel1 and Panel2
Panel1 has a ToolStrip for the Buttons I have
Panel2 of the SplitContainer has two Panel controls (One called Form and the other called Data)
When I click on the buttons in the ToolStrip I want the desired Form to load in Form Panel using a string name I provide which matches the Form Name. The name of the form is placed in a Public Property defined as a string; p_sPanelFormName..
Panel Form will switch between the various Forms showing what I want with results placed in the Panel Data as needed. I have the attached VB.NET code which appears to do what I want, but I get the error, "Object reference not set to an instance of an object.
Help please... Thank you.
Code executed to update Panel Form with the new Form with its name stored in p_sPanelFormName:
Dim f_PanelForm As Form = oclsObjects.fncCreateForm(
f_PanelForm.TopLevel = False
f_PanelForm.Parent = Me
Panel_Form.Controls.Add(f_
f_PanelForm.Show()
--------------------
Class containing Function to create the new instance of the Form I was to display in the Panel Form:
Imports System
Imports System.Windows.Forms
Imports System.Reflection
Public Class clsMod_CreateObjects
'01.00.000 04/06/2012 04/06/2012 Initial release of this Function
Public Function fncCreateObjectInstance(By
' Creates and returns an instance of any object in the assembly by its type name.
Dim obj As Object
Try
If objectName.LastIndexOf("."
'Appends the root namespace if not specified.objectName = [Assembly].GetEntryAssembl
End If
obj = [Assembly].GetEntryAssembl
Catch ex As Exception
obj = Nothing
End Try
Return obj
End Function
'01.00.000 04/06/2012 04/06/2012 Initial release of this Function
Public Function fncCreateForm(ByVal formName As String) As Form
' Return the instance of the form by specifying its name.
Return DirectCast(fncCreateObject
End Function
End Class
--------------------------
According to the first part of code I am not creating a new instance of the Form from the Public Property string. I am not sure how to go about this. Also, I need to update my code to show the proper Panel Form to the user which is contained in SplitContainer.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
After I wrote my reply I looked again at BuggyCoder's example. It turns out I was missing a line of code and had a space/invalid character preventing the AssemblyName from being acquired. Weird. So I created a brand new project without any "questionable" code in the class or Forms.<br /><br />The following class worked perfectly:<br /><br />Imports System<br />Imports System.Reflection<br /><br /><br />Public Class clsMod_CreateObjects<br /><br /> '01.00.000 04/06/2012 04/06/2012 Initial release of this Function<br /> Public Shared Function CreateObjectInstance(ByVal objectName As String) As Object<br /><br /> ' Creates and returns an instance of any object in the assembly by its type name.<br /> Dim obj As Object<br /> Try<br /> If objectName.LastIndexOf("." ) = -1 Then<br /> 'Appends the root namespace if not specified.<br /> objectName = [Assembly].GetEntryAssembl y.GetName. Name & "." & objectName<br /> End If<br /> obj = [Assembly].GetEntryAssembl y.CreateIn stance(obj ectName)<b r /> Catch ex As Exception<br /> obj = Nothing<br /> End Try<br /> Return obj<br /><br /> End Function<br /><br /> '01.00.000 04/06/2012 04/06/2012 Initial release of this Function<br /> Public Shared Function CreateForm(ByVal formName As String) As Form<br /><br /> ' Return the instance of the form by specifying its name.<br /> Return DirectCast(CreateObjectIns tance(form Name), Form)<br /><br /> End Function<br /><br />End Class
ASKER
The first function shown creates the object. The second function calles the first function and creates the Form, but I know I nead a New version of the form. That is why I am getting the error. That is what I need assistance for.
CodeCruiser,
Your example gives me the same error. In this case if I add "New" in front of "Form =' I get "End of statement expected.
BuggyCoder, this example looks like it would work, but when I send the assembly name concatinating the form name from public property p_sName I get "value cannot be null parameter name type from the line, " obj = Activator.CreateInstance(m
I tried all three suggestions so far. ...