hola a todos estoy haciendo una pequeña aplicación Windows forms, en un panel cargo los usercontrol de que tienen formularios, grid, etc. lo único es que 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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SAF
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void nuevoClienteToolStripMenuItem_Click_1(object sender, EventArgs e)
{
if (!panel3.Controls.Contains(InsercionClientes.Instance))
{
panel3.Controls.Add(InsercionClientes.Instance);
InsercionClientes.Instance.Dock = DockStyle.Fill;
InsercionClientes.Instance.BringToFront();
}//if de estado de UC
else {
InsercionClientes.Instance.BringToFront();
}//else
menuStrip1.Enabled = false;
}
}
}
Cita de: d91 en 16 Octubre 2015, 00:13 AMen 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 (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.toplevel%28v=vs.110%29.aspx)
Cita de: d91 en 16 Octubre 2015, 00:13 AMquiero 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.ControlRemoved
Ejemplo 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!