Another problem! (Damn VB6 was much easier)

Reapz

Regular
Joined
Dec 15, 2002
Messages
74
A button on my Form1 opens Form2. Simple as that.
In VB6 I was using....

Visual Basic:
Form2.Show(1)

to show the form modally and the cancel button on Form2 would have the code...

Visual Basic:
Unload Me

This doing the same thing as clicking on the close icon.

Form2 would appear, its Load event having been executed and then it would close when the appropriate button was clicked. If I wanted to open it again then it would do so exactly the same.

Now in VB.NET I can't use Form2.Show(1) apparently I have to use...

Visual Basic:
Form2.ShowDialog()

...if I want the form to open modally. So here we get to the first problem. If I use ShowDialog instead of Show then the Load event of the form doesn't execute. So I use Form2.Show() and put up with the fact the form isn't modal.

The second problem is that Unload Me no longer exists and according to another thread here the equivalent is...

Visual Basic:
Me.Close()

This however causes problems when I click the button to execute the code Form2.Show() code again. It gives me the error 'Cannot access a disposed object named "Form2".' I can make the Cancel button Me.Hide() instead but if the user clicks the close icon then this error is gonna occur.

Oh my god my head's about to explode.

All I'm after is for Form2 to open modally AND execute its Load event AND NOT get that damned error when I try an open it again later. (Something I could do in VB6 in 2 lines containing 4 words, 1 integer, 1 pair of brackets and a full stop!)

And if at all possible could someone tell me why Microsoft would take something as easy to use as VB6 and turn it into the complete and utter pig that is VB.NET?

Grrrr.... :mad:
 
Try this:
Visual Basic:
'In Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New Form2()
        frm.ShowDialog()
    End Sub

'In Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MessageBox.Show("Wheeeeee!!! I am Form2_Load's code!")
    End Sub
 
Ok the bit in Form1 is the same as that already and I commented out everything else in my Form2_Load and added your line.

The Load event still didn't execute with ShowDialog! :(



I forgot to mention the disposed error doesn't occur with ShowDialog.
 
Last edited:
Why use the Load event at all? Why not put initialization code in the form's constructor after the InitializeComponent call?
 
Well, initialization code would fire on the Dim frm As New Form2() line,
instead of on the showing of the form. In this case, that wouldn't
really matter because they are right beside each other, but in some
cases, it could throw some things off.

But to try it, expand the 'Windows forms designer generated code'
region, and look for the constructor:
Visual Basic:
Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub
And then try adding your Form2_Load coad underneath of
that second comment.
 
Last edited:
Visual Basic:
Public Sub New()
    MyBase.New()

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add your code here <-<-<-<-

End Sub
 
Last edited:
Cheers guys! I found that and it now works perfectly. I get to use ShowDialog so the form is modal and I don't get that annoying error. Cool! :)
 
Just remember that the constuctor and Load event are not the same.
Load fires before the form is shown for the first time, and the constructor
is fired when the form is initialized (Dim frm As New Form2).
 
Back
Top