en un panel cargo los usercontrol
No es necesario que heredes la trivialidad de un
UserControl, puedes heredar un
Form, solamente tienes que tener en cuenta desactivar la propiedad
Form.TopLevel para hacer el MDI.
➢
Form.TopLevel Property - MSDN
quiero forzar al usuario a que cierre el usercontrol para poder abrir otro
pensé en deshabilitar el menú al abrir el usercontrol, pero no se en que evento habilitarlo para cuando se cierre el usercontrol
Te daré varias opciones...
1. - Si quieres desactivar/activar el menu entero, puedes suscribirte a los eventos
Panel.ControlAdded y
Panel.ControlRemovedEjemplo en VB.Net:Private Sub Panel3_ControlAdded(ByVal sender As Object, ByVal e As ControlEventArgs) _
Handles Panel3.ControlAdded,
Panel3.ControlRemoved
Me.nuevoClienteToolStripMenuItem.Enabled =
Not DirectCast(sender, Panel).Controls.OfType(Of CustomMDIForm).Any
End Sub
Ejemplo en C#:private void Panel3_ControlAdded_And_ControlRemoved(object sender, ControlEventArgs e) {
this.nuevoClienteToolStripMenuItem.Enabled = !((Panel)sender).Controls.OfType<CustomMDIForm>.Any();
}
2. - Si quieres desactivar/activar un item en particular del menu, puedes suscribirte al evento
ToolStripMenuItem.DropDownOpening y acceder al item en cuestión en la colección
ToolStripMenuItem.DropDownItems.
Ejemplo en VB.Net:Private Sub NuevoClienteToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles nuevoClienteToolStripMenuItem.DropDownOpening
DirectCast(sender, ToolStripMenuItem).DropDownItems(index:=0).Enabled =
Not Me.Panel3.Controls.OfType(Of CustomMDIForm).Any
End Sub
Ejemplo en C#:private void NuevoClienteToolStripMenuItem_Click(object sender, EventArgs e) {
((ToolStripMenuItem)sender).DropDownItems(index: 0).Enabled = !this.Panel3.Controls.OfType<CustomMDIForm>.Any();
}
3. - También puedes administrar la visibilidad del menú desde tu
Form heredado o desde un
Usercontrol, de la misma manera.
En tu herencia, le pasas la instancia del
ToolStipMenuItem al Constructor de la class, y cambias su visibilidad suplantando los métodos
OnLoad y
OnDispose.
Ejemplo en VB.Net:
Public NotInheritable Class CustomMDIForm : Inherits Form
Public ReadOnly MenuItem As ToolStripMenuItem
Public Sub New(ByVal parent As Control, ByVal menuItem As ToolStripMenuItem)
With Me
.TopLevel = False
.Parent = parent
.StartPosition = FormStartPosition.CenterParent
.FormBorderStyle = FormBorderStyle.Sizable
.Dock = DockStyle.Fill
End With
Me.MenuItem = menuItem
End Sub
Private Sub New()
End Sub
Protected Overrides Sub OnLoad(ByVal e As EventArgs)
If (Me.MenuItem IsNot Nothing) Then
Me.MenuItem.Enabled = False
End If
MyBase.OnLoad(e)
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If (Me.MenuItem IsNot Nothing) Then
Me.MenuItem.Enabled = True
End If
MyBase.Dispose(Disposing)
End Sub
End Class
+
Public NotInheritable Class Form1 : Inherits Form
Private cf As CustomMDIForm
Public Sub New()
Me.InitializeComponent()
Me.cf = New CustomMDIForm(parent:=Me.Panel3, menuItem:=Me.nuevoClienteToolStripMenuItem)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Load
Me.cf.Show()
End Sub
End Class
Traducción online a C#:using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public sealed class CustomMDIForm : Form {
public readonly ToolStripMenuItem MenuItem;
public CustomMDIForm(Control parent, ToolStripMenuItem menuItem) {
this.TopLevel = false;
this.Parent = parent;
this.StartPosition = FormStartPosition.CenterParent;
this.FormBorderStyle = FormBorderStyle.Sizable;
this.Dock = DockStyle.Fill;
this.MenuItem = menuItem;
}
private CustomMDIForm() {
}
protected override void OnLoad(EventArgs e) {
if ((this.MenuItem != null)) {
this.MenuItem.Enabled = false;
}
base.OnLoad(e);
}
protected override void Dispose(bool disposing) {
if ((this.MenuItem != null)) {
this.MenuItem.Enabled = true;
}
base.Dispose(disposing);
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
+
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public sealed class Form1 : Form {
private CustomMDIForm cf;
public Form1() {
Load += Form1_Load;
this.InitializeComponent();
this.cf = new CustomMDIForm
(parent
: this.Panel3, menuItem
: this.nuevoClienteToolStripMenuItem); }
private void Form1_Load(object sender, EventArgs e) {
this.cf.Show();
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
Saludos!