hola todos, tengo un user control, este ultimo lo muestro en un panel de un form (visula express 2012 desktop), el user control tiene textbox, listbox..., la instancia del user control:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using RNUcodigo;
using RNUDataAccess;
using RNUEntities;
namespace UI
{
public partial class UCnuevoUsuario : UserControl
{
private static UCnuevoUsuario _Instance;
public static UCnuevoUsuario Instance
{
get
{
if (_Instance == null)
_Instance
= new UCnuevoUsuario
(); return _Instance;
}//get
}//instanciando el userContol
public UCnuevoUsuario()
{
InitializeComponent();
}
lo muestro en el panel del form principal asi:
private void agregarToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!panel1.Controls.Contains(UCnuevoUsuario.Instance))
{
panel1.Controls.Add(UCnuevoUsuario.Instance);
UCnuevoUsuario.Instance.Dock = DockStyle.Fill;
UCnuevoUsuario.Instance.BringToFront();
}//if
else {
UCnuevoUsuario.Instance.BringToFront();
}//else
}
y lo remuevo del panel asi:
private void btnsalir_Click(object sender, EventArgs e)
{
this.Parent.Controls.Remove(this);
}
pero cuando lo vuelvo a abrir me aparece con los datos que le había ingresado anteriormente, habrá otra opción de destruirlo sin ponerle a cada textbox.text = "" del usercontrol, para que no me aparezca lleno cuando vuelva a llamarlo?
Eliminar manualmente un user-control de una colección de controles no implica su auto-liberación, el método base
Dispose no se llama (sin embargo, esto no se aplica al liberar manualmente un Form, y su colección de controles), así que una solución a la forma en la que tienes adaptado el código original que has posteado, sería la siguiente (ni falta decir que esto es muy incorrecto):
protected override void OnVisibleChanged(EventArgs e) {
if (!base.Visible) {
_Instance = null;
}
base.OnVisibleChanged(e);
}
En general, la metodología que estás desarrollando en la Class para utilizar el control es inapropiada, ¿por que simplemente no usas el constructor base de la class para instanciar el user-control?, además de ser una solución al problema.
Puedes hacerlo de la siguiente manera:
Public NotInheritable Class MyControl : Inherits UserControl
End Class
+
Public NotInheritable Class Form1 : Inherits Form
Friend WithEvents UserControl1 As MyControl
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.UserControl1 = New MyControl
End Sub
' Añadir
Private Sub Button1_Click(sender As Object, e As EventArgs) _
Handles Button1.Click
If Me.UserControl1.IsDisposed Then
Me.UserControl1 = New MyControl
End If
Me.Controls.Add(Me.UserControl1)
End Sub
' Liberar
Private Sub Button2_Click(sender As Object, e As EventArgs) _
Handles Button2.Click
Me.UserControl1.Dispose()
End Sub
End Class
Taducción online a C#:
public sealed class MyControl : UserControl {
}
+
public sealed class Form1 : Form {
internal MyControl UserControl1;
public Form1() {
this.UserControl1 = new MyControl
(); }
// faltan los handlers en la conversion.
// Añadir
private void Button1_Click(object sender, EventArgs e) {
if (this.UserControl1.IsDisposed) {
this.UserControl1 = new MyControl
(); }
this.Controls.Add(this.UserControl1);
}
// Liberar
private void Button2_Click(object sender, EventArgs e) {
this.UserControl1.Dispose();
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
Saludos!