Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: d91 en 22 Febrero 2016, 17:33 pm



Título: ayuda para destruir user control
Publicado por: d91 en 22 Febrero 2016, 17:33 pm
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
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using RNUcodigo;
  11. using RNUDataAccess;
  12. using RNUEntities;
  13.  
  14. namespace UI
  15. {
  16.    public partial class UCnuevoUsuario : UserControl
  17.    {
  18.        private static UCnuevoUsuario _Instance;
  19.  
  20.        public static UCnuevoUsuario Instance
  21.        {
  22.  
  23.            get
  24.            {
  25.                if (_Instance == null)
  26.                    _Instance = new UCnuevoUsuario();
  27.                return _Instance;
  28.            }//get
  29.        }//instanciando el userContol
  30.  
  31.  
  32.        public UCnuevoUsuario()
  33.        {
  34.            InitializeComponent();
  35.        }
  36.  
  37.  
lo muestro en el panel del form principal asi:

Código
  1. private void agregarToolStripMenuItem_Click(object sender, EventArgs e)
  2.        {
  3.            if (!panel1.Controls.Contains(UCnuevoUsuario.Instance))
  4.            {
  5.                panel1.Controls.Add(UCnuevoUsuario.Instance);
  6.                UCnuevoUsuario.Instance.Dock = DockStyle.Fill;
  7.                UCnuevoUsuario.Instance.BringToFront();
  8.  
  9.            }//if
  10.            else {
  11.                UCnuevoUsuario.Instance.BringToFront();
  12.            }//else
  13.        }
  14.  

y lo remuevo del panel asi:

Código
  1. private void btnsalir_Click(object sender, EventArgs e)
  2.        {
  3.            this.Parent.Controls.Remove(this);
  4.        }
  5.  

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?


Título: Re: ayuda para destruir user control
Publicado por: Eleкtro en 22 Febrero 2016, 18:20 pm
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
  1. protected override void OnVisibleChanged(EventArgs e) {
  2. if (!base.Visible) {
  3. _Instance = null;
  4. }
  5. base.OnVisibleChanged(e);
  6. }

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
  1. Public NotInheritable Class MyControl : Inherits UserControl
  2. End Class
+
Código
  1. Public NotInheritable Class Form1 : Inherits Form
  2.  
  3.    Friend WithEvents UserControl1 As MyControl
  4.  
  5.    Public Sub New()
  6.  
  7.        ' This call is required by the designer.
  8.        InitializeComponent()
  9.  
  10.        ' Add any initialization after the InitializeComponent() call.
  11.        Me.UserControl1 = New MyControl
  12.  
  13.    End Sub
  14.  
  15.    ' Añadir
  16.    Private Sub Button1_Click(sender As Object, e As EventArgs) _
  17.    Handles Button1.Click
  18.  
  19.        If Me.UserControl1.IsDisposed Then
  20.            Me.UserControl1 = New MyControl
  21.        End If
  22.  
  23.        Me.Controls.Add(Me.UserControl1)
  24.    End Sub
  25.  
  26.    ' Liberar
  27.    Private Sub Button2_Click(sender As Object, e As EventArgs) _
  28.    Handles Button2.Click
  29.  
  30.        Me.UserControl1.Dispose()
  31.  
  32.    End Sub
  33.  
  34. End Class

Taducción online a C#:
Código
  1. public sealed class MyControl : UserControl {
  2. }
+
Código
  1. public sealed class Form1 : Form {
  2.  
  3.    internal MyControl UserControl1;
  4.  
  5.    public Form1() {
  6.        this.UserControl1 = new MyControl();
  7.    }
  8.    // faltan los handlers en la conversion.
  9.  
  10.    // Añadir
  11.    private void Button1_Click(object sender, EventArgs e) {
  12.        if (this.UserControl1.IsDisposed) {
  13.            this.UserControl1 = new MyControl();
  14.        }
  15.        this.Controls.Add(this.UserControl1);
  16.    }
  17.  
  18.    // Liberar
  19.    private void Button2_Click(object sender, EventArgs e) {
  20.        this.UserControl1.Dispose();
  21.    }
  22. }
  23.  
  24. //=======================================================
  25. //Service provided by Telerik (www.telerik.com)
  26. //=======================================================

Saludos!