ayuda para destruir user control

Iniciado por d91, 22 Febrero 2016, 17:33 PM

0 Miembros y 1 Visitante están viendo este tema.

d91

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:
Código (csharp) [Seleccionar]

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:

Código (csharp) [Seleccionar]

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:

Código (csharp) [Seleccionar]

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?

Eleкtro

#1
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):

Código (csharp) [Seleccionar]
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:

Código (vbnet) [Seleccionar]
Public NotInheritable Class MyControl : Inherits UserControl
End Class

+
Código (vbnet) [Seleccionar]
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#:
Código (csharp) [Seleccionar]
public sealed class MyControl : UserControl {
}

+
Código (csharp) [Seleccionar]
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!