none
Pasar informacion entre formularios RRS feed

  • Pregunta

  • Hola:

    Tengo un problema a la hora de pasar información entre formularios. Realicé los formularios y cuando necesito obtener un campo de un formulario emergente tipo datagridview usaba un método que encontré en

    http://ltuttini.blogspot.com/2010/01/c-datagridview-parte-3-pasaje-de.html

    Me funcionaba perfectamente. El problema ha sido que una vez terminados todos los formularios hice un formulario principal en el que he incluido todos. Al incluirlos todos en el principal (es MDIContainer) pasar la información entre formularios de esa forma ya no es posible, pues this.Owner ahora es el formulario Principal aunque abra un formulario a partir de otro ( y obtengo parent = null) porque principal no implemente esa interfaz). Como puedo solucionar esto?

     

    Pongo a continuación los datos relevantes de principal y los otros formularios:

    En el formulario Principal:

     

    public Principal()<br/>
        {<br/>
          InitializeComponent();<br/>
          //Para poder abrir otros formularios en esta misma ventana<br/>
          this.IsMdiContainer = true;<br/>
        }
    
    private void submenuProveedores_Click(object sender, EventArgs e)<br/>
        {<br/>
          frmProveedores form = SingletonFormProvider.GetInstance<frmProveedores>(this);<br/>
          form.Show();<br/>
        }
    
    public class SingletonFormProvider<br/>
      {<br/>
        private static Dictionary<Type, Form> mTypeFormLookup = new Dictionary<Type, Form>();<br/>
    <br/>
        public static T GetInstance<T>(Form owner) where T : Form<br/>
        {<br/>
          return GetInstance<T>(owner, null);<br/>
        }<br/>
        /// <summary><br/>
        /// Comprueba si existe una instancia de dicho formulario, trayendola al frente<br/>
        /// si existe o creandola si no existe.<br/>
        /// </summary><br/>
        /// <typeparam name="T">Tipo de formulario</typeparam><br/>
        /// <param name="owner">this</param><br/>
        /// <param name="args">Parametros del constructor del formulario</param><br/>
        /// <returns>Instancia de formulario</returns><br/>
        public static T GetInstance<T>(Form owner, params object[] args) where T : Form<br/>
        {<br/>
          if (!mTypeFormLookup.ContainsKey(typeof(T)))<br/>
          {<br/>
            Form f = (Form)Activator.CreateInstance(typeof(T), args);<br/>
            mTypeFormLookup.Add(typeof(T), f);<br/>
            f.Owner = owner;<br/>
            f.MdiParent = owner;<br/>
            f.FormClosed += new FormClosedEventHandler(remover);<br/>
          }<br/>
          else<br/>
          {<br/>
            Form f;<br/>
            mTypeFormLookup.TryGetValue(typeof(T),out f);<br/>
            f.BringToFront();<br/>
          }<br/>
          return (T)mTypeFormLookup[typeof(T)];<br/>
        }
    

    En el formulario frmProveedores:

    public partial class frmCircuitos : UI.frmBase,IAddItem<br/>
      {<br/>
        <br/>
        #region IAddItem Members<br/>
    <br/>
        public void PasarEntidad(IEntidad entidad)<br/>
        {<br/>
          if (entidad is ProveedorEntidad)<br/>
          {<br/>
            ProveedorEntidad proveedorE = (ProveedorEntidad)entidad;<br/>
            this.txtId_Proveedor.Text = this.txtId.Text = String.Format("{0:0000}", proveedorE.Id);<br/>
            this.txtNombre_Proveedor.Text = proveedorE.Nombre_Proveedor;<br/>
            this.txtId_Transporte.Focus();<br/>
          }<br/>
          else if (entidad is TransporteEntidad)<br/>
          {<br/>
            TransporteEntidad transporteE = (TransporteEntidad)entidad;<br/>
            this.txtId_Transporte.Text = this.txtId.Text = String.Format("{0:0000}", transporteE.Id);<br/>
            this.txtNombre_Transporte.Text = transporteE.Nombre_Transporte;<br/>
            this.txtNotas.Focus();<br/>
          }<br/>
          <br/>
    <br/>
        }<br/>
    <br/>
        #endregion<br/>
    <br/>
        private void btnProveedor_Click(object sender, EventArgs e)<br/>
        {<br/>
          ProveedorEntidad entidad = new ProveedorEntidad();<br/>
          entidad.Nombre_Proveedor = txtNombre_Proveedor.Text;<br/>
          frmListaProveedores formulario = new frmListaProveedores(entidad);<br/>
          formulario.ShowDialog(this);<br/>
          this.txtId_Transporte.Focus();<br/>
        }<br/>
    <br/>
    <br/>
        <br/>
    <br/>
    <br/>
    <br/>
        <br/>
      }<br/>
    }
    

    En el formulario que se abre al pulsar el boton en frmProveedores y del que se quiere extraer la informacion:

    public partial class frmListaProveedores : Form<br/>
      {<br/>
        private ProveedorEntidad entidad;<br/>
        <br/>
        public frmListaProveedores(ProveedorEntidad entidad)<br/>
        {<br/>
          InitializeComponent();<br/>
          this.entidad = entidad;<br/>
        }<br/>
    <br/>
        // Evento de UserControl dgvProveedor<br/>
        private void dgvProveedor1_DobleClickCeldaDgv(ProveedorEntidad entidad)<br/>
        {<br/>
          IAddItem parent = this.Owner as IAddItem;<br/>
          parent.PasarEntidad(entidad);<br/>
          this.Close();<br/>
        }<br/>
    <br/>
      }<br/>
    }
    

     

    miércoles, 29 de septiembre de 2010 10:43

Respuestas

  • hola

    el tema es que cuando cambias a un ambiente MDI, el Owner deja de funcionar

    no se si habias analziado este link

     

      Comunicar formularios MDI

    veras que ya no se usa el Owner, y se crea una propiedad especial para esta operacion

    es esta la que contendra el formulario que implementa la interfaz y recibira la accion

    resumen en un ____ MDI no uses el owner para definir que form debe invocar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Alvaro Matabuena miércoles, 29 de septiembre de 2010 12:41
    miércoles, 29 de septiembre de 2010 12:38

Todas las respuestas

  • hola

    el tema es que cuando cambias a un ambiente MDI, el Owner deja de funcionar

    no se si habias analziado este link

     

      Comunicar formularios MDI

    veras que ya no se usa el Owner, y se crea una propiedad especial para esta operacion

    es esta la que contendra el formulario que implementa la interfaz y recibira la accion

    resumen en un ____ MDI no uses el owner para definir que form debe invocar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Alvaro Matabuena miércoles, 29 de septiembre de 2010 12:41
    miércoles, 29 de septiembre de 2010 12:38
  • Gracias, es lo que buscaba. Que pena no haberlo sabido antes, jeje.
    miércoles, 29 de septiembre de 2010 12:42