i am new to VB.Net. I have an assignment to submit next week that is on the 5 november 2007, and am having some problem in creating my program. Can you please help?

i want to limit my MDI to open only one specific form at a time. like for example if the menu balance is selected from the mdi, it must display a form and the menu in the mdi mus be disable.
Here is the code used, the only thing is that i do not know how to make the button enable again once the form is closed.


Public Class Bank_Account
Inherits System.Windows.Forms.Form
Dim View_Balance As Integer = 0
Dim childForms(1) As Balance


Private Sub mnuBalance_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuBalance.Click

View_Balance += 1
childForms(View_Balance) = New Balance
childForms(View_Balance).Text = "ChildForm" & Str(View_Balance)

'setting title for child windows and incrementing the number with an array
childForms(View_Balance).MdiParent = Me
childForms(View_Balance).Show()
mnuBalance.Visible = False

End Sub

please do answer me because i really don't know what to do anymore.

i wanted to use an if condition to do the above by the click of the button but i do not know how. please help.

my regards,

Dani AI

Generated

Brief summary and two safe patterns to finish the thread started by (and building on hints from , and ):

A — parent‑managed, single‑instance (recommended)

  • Keep one reference to the open child in the MDI parent; before creating a new Balance form scan that reference (or Me.MdiChildren) and activate the existing instance instead of creating another.
  • Attach a handler from the parent to the child’s Closed event so the parent can restore the menu state when the child actually closes.
' In the MDI parent
Private currentBalance As Balance

Sub ShowBalance()
  If currentBalance IsNot Nothing AndAlso Not currentBalance.IsDisposed Then
    currentBalance.Activate()
    Return
  End If

  currentBalance = New Balance()
  currentBalance.MdiParent = Me
  AddHandler currentBalance.Closed, AddressOf BalanceClosed
  currentBalance.Show()
  balanceMenuItem.Enabled = False
End Sub

Private Sub BalanceClosed(ByVal sender As Object, ByVal e As EventArgs)
  currentBalance = Nothing
  balanceMenuItem.Enabled = True
End Sub

B — child‑notifies‑parent (quick alternative)

  • In the child’s Closed/Closing handler cast the MdiParent back to the parent type and restore the menu. This avoids a module/global variable:
' Inside the Balance form's Closed event (VB.NET 2003 uses Closed/Closing)
Dim p = CType(Me.MdiParent, Bank_Account)
p.balanceMenuItem.Enabled = True

Notes and design tips

  • For VB.NET 2003 use the Closing/Closed events and CancelEventArgs/EventArgs (FormClosing/FormClosed were introduced later). That was the cause of the errors shown earlier.
  • Prefer disabling a menu item (Enabled = False) rather than hiding it (Visible = False) so layout and discoverability remain consistent.
  • A WinForms form cannot be both an MDI parent and an MDI child at the same time. For the multi‑level UI the usual approaches are: a single top MDI container with all children under it, or embedding UserControls/panels inside a child form to act like a nested workspace instead of trying to nest MDI containers.

Recommended Answers

All 10 Replies

Try enabling the menu on

Private Sub frmMDIChild_FormClosing(ByVal sender As Object, _
 ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
               'Enable Menu Here
 
 
End Sub

Where am i suppose to place the code?? Because when i paste it in my MDI form, the

System.Windows.Forms.FormClosingEventArgs(it says not define)
and

Me.FormClosing(Ketword not valid as an identifier)
are underline...

what am i suppose to do???

Where am i suppose to place the code?? Because when i paste it in my MDI form, the

System.Windows.Forms.FormClosingEventArgs(it says not define)
and

Me.FormClosing(Ketword not valid as an identifier)
are underline...

what am i suppose to do???

You should put the code in the form closing event for the View_Balance form.

Private Sub View_Balance _FormClosing(ByVal sender As Object, _

ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing'Enable Menu HereBank_Account.mnuBalance.enabled= TrueEnd Sub

thx a lot for replying...ok i think i understand.
I double clicked on my Balance form which is the child, and i changed its declaration as closing...I got the abouve result, but the thing is that frmBank_Account.mnuBalance.enabled=true is not working...
do i need to create a module smething like that???

Which version of vb.net are you using? The code I posted works with the 2005 one.

You will have to add a module to your project and then declare a public variable inside your module as menuitem. After that, in the parent form's activated event, set the varialbe you declared in the module equal to mnuBalance. In the closing event for the View_Balance form, enable the module level variable. I'll include the code below to help out.

The module code:

OptionStrictOn
 
Module mVariables
 
  Public mBalance As MenuItem
 
EndModule

The code in the form activated event for Bank_Account:

PrivateSubBank_Account_Activated(ByVal sender AsObject, ByVal e As System.EventArgs) HandlesMyBase.Activated
 
 mBalance= mnuBalance
 
End sub

The code in the from closing event for View_Balance:

PrivateSub View_Balance_Closing(ByVal sender AsObject, ByVal e As System.ComponentModel.CancelEventArgs) HandlesMyBase.Closing
 
 mBalance.Enabled = True
 
End sub

I thank u very much for your help. it works perfectly...
i have one more question to ask...
Suppose i have 4 forms, 1st one is frmMainProg which is an IsMDIContainer, once mnulogin is selected, the 2nd form which is frmlogin appears and once login, frmBank_Account appears(also acts as IsMDIContainer)and finally once frmbalance is selected from frmBank_Account, rmBalance appears. the problem is that the frmBank_Account cannot be both mdichildren and mdiparent at the same time. Is there any solution for this????

I have a procedure that does this

Public Sub ShowForm(ByVal FrmSwitch As FrmToShow)

Select Case FrmSwitch

Case Is = FrmToShow.FrmRecommendAssignment
If _FrmRecommendAssignment = 1 Then
ChildForm8.FindForm()
Else
ChildForm8 = New FrmRecommendAssignment
ChildForm8.Visible = True
ChildForm8.MdiParent = Me
ChildForm8.StartPosition = FormStartPosition.CenterScreen
ChildForm8.Show()
_FrmRecommendAssignment += 1
End If
end select

thx 2 you all for your help

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.