Open a form - simple Not!


Author
Message
Peter Jones
Peter Jones
Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)
Group: Forum Members
Posts: 386, Visits: 2.1K
Hi,

No doubt there is an easy solution to this but after serveral hours and failing to find it why not ask the experts? I have a project that contains a meu form (DevExpress NavBar) which is populated from the database. So, I click on an item and I now have a form name which I want to open. Here's the hard part - I can't find any way to iterate through all the forms in my project and .Show the right one, i.e. I can find a forms collection (open forms I can see but not all the forms in my project). I'm just about ready to write a large Case statement to, e.g

Select Case FormName
 Case "Form1"
          My.Forms.Form1.Show()
 Case "Form2"
          My.Forms.Form2.Show()

but obviously I don't want to do that. What's the best way of doing things?

Cheers, Peter

StarkMike
StarkMike
StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)StrataFrame User (448 reputation)
Group: Forum Members
Posts: 436, Visits: 944
Peter, I too had trouble with this once... here's the help i received...



http://forum.strataframe.net/Topic8063-14-1.aspx



You'd think there SHOULD be an easier way to do this. Oh well.
StrataFrame Team
S
StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)StrataFrame Developer (4.2K reputation)
Group: StrataFrame Developers
Posts: 3K, Visits: 2.5K
Yep, the link that Mike pointed you to is correct... you'll need to use Type.GetType() and pass the full name of the form you want to show.  So, something like this:

DirectCast(Activator.CreateInstance(Type.GetType(FormName)), Form).Show()

The Type.GetType() is a method that accepts a string name for the form (i.e.: "MyNamespace.MyFormName") and returns the System.Type for that form.  The Activator.CreateInstance() accepts a type and creates a new instance of it through reflection to find the default constructor.  The DirectCast just CTypes the returned object as a Form, and Show() is pretty self explanatory. 

So, the only change you'll need to make is to change the FormName that you're storing off in DevEx's menu from just "Form1" to "MyNamespace.Form1" so that you will have the full type name of the form you want to show.

Ben Hayat
Ben Hayat
Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)Advanced StrataFrame User (516 reputation)
Group: Forum Members
Posts: 374, Visits: 1.2K
I just went thru that in C# and GetType (that is used in VB) threw me off until Ben (Chase) came to rescue.

..ßen
Greg McGuffey
Greg McGuffey
Strategic Support Team Member (3.3K reputation)
Group: Forum Members
Posts: 2K, Visits: 6.6K
Ben (Chase),



Could you post a little code sample that shows how to do this if you want to pass values to a constructor of the form? This topic is in the category of "I get it until I have to code it...then I'm confused" Blink
Peter Jones
Peter Jones
Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)
Group: Forum Members
Posts: 386, Visits: 2.1K
Hi Guys,

Thanks for your input and Ben, thanks for taken the time to explain what was happening in that line of code - very helpful.

All in all this is sooooo depressing - it seems that every time I learn a bit more about .Net it only serves to underline how little I know!!

Cheers, Peter

Trent Taylor
Trent Taylor
StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)
Group: StrataFrame Developers
Posts: 6.6K, Visits: 6.9K
The Activator accepts a Param Array as a second parameter which allows you to provide parms to the constructor of a created instance:

Activator.CreateInstance(GetType(MyForm), New Object() {Parm1})

or

Activator.CreateInstance(GetType(MyForm), Parm1)

Greg McGuffey
Greg McGuffey
Strategic Support Team Member (3.3K reputation)
Group: Forum Members
Posts: 2K, Visits: 6.6K
Thanks Trent. Slowly its starting to make sense.... Alien
Peter Jones
Peter Jones
Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)Advanced StrataFrame User (504 reputation)
Group: Forum Members
Posts: 386, Visits: 2.1K
Hi Guys,

A follow up - I want to check if a form is already open before I instasiate a new one. I know (thought I knew) how to do this with (and other variations on this theme):       

        Dim OpenForms As FormCollection
        OpenForms = Application.OpenForms

        ' Lets see if the form is already open and, if it is, bring it to the front.
        For i As Integer = 0 To System.Windows.Forms.Application.OpenForms.Count - 1
            If OpenForms(i).Tag.ToString = e.Link.Item.Name.ToString Then
                OpenForms(i).WindowState = FormWindowState.Normal
                OpenTheForm = False
                Exit For
            End If
        Next

However, OpenForms.Count always returns zero (even the first time in when just the menu form itself if running). I've been Googling madly to see if there is any reference to the OpenForms.Count being zero and I couldn't find anything - lots of reference to the property in examples of working code - no reference to any problems/caveats.

Any ideas?

Cheers, Peter

Trent Taylor
Trent Taylor
StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)StrataFrame Developer (10K reputation)
Group: StrataFrame Developers
Posts: 6.6K, Visits: 6.9K
If you are running your forms through an MDI environment then you can just reference the MDIChildren collection and create a method to tell you if it is running.  We have a MenuSystem class that we pass all of our forms through and then create handlers so that the form will remove itself from our own collection.  Either way will work.  Below is a sample of how to reference the MDIChildren collection to see if a form is within the MDI collection.

Private Function IsFormRunning(ByVal FormType As System.Type) As Boolean
        '-- Establish Locals
        Dim llReturn As Boolean = False
        '-- Cycle through all of the children forms within this MDI
        For Each loForm As Form In Me.MdiChildren
            llReturn = loForm.GetType() Is FormType
            If llReturn Then Exit For
        Next
        Return llReturn
    End Function

 


GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...




Similar Topics

Reading This Topic

Login

Explore
Messages
Mentions
Search