SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: lalo_soft en Jueves 3 de Julio de 2008, 06:58

Título: Accesar a controles de un form hijo
Publicado por: lalo_soft en Jueves 3 de Julio de 2008, 06:58
Hice una app tipo MDI , pero no logro que el form padre tenga aceso a los contoles (TreeView en este caso) del form hijo.
Alguien del foro sabe como hacerlo.
Título: Re: Accesar a controles de un form hijo
Publicado por: Mollense en Jueves 3 de Julio de 2008, 16:55
Cita de: "lalo_soft"
Hice una app tipo MDI , pero no logro que el form padre tenga aceso a los contoles (TreeView en este caso) del form hijo.
Alguien del foro sabe como hacerlo.
¿Tenés la referencia a ese form? Si es así y no podés acceder seguramente se debe a qye el TreeView está declarado como "private", algo feo que podrías hacer es declararlo como público pero eso es horrible, yo te sugiero 1 de estas tres opciones:
1) Cambiá la declaración del TreeView de "private" a "public", sin duda la opción mas fácil, pero la peor.
En el hijo:
Código: Text
  1. public System.Windows.Forms.TreeView miTreeView;
  2.  
Desde el padre:
Código: Text
  1. formulario.miTreeView.Nodes.Add("Nuevo Nodo");
  2.  

2)Crear métodos públicos en el formulario hijo y que estos sean quienes manipulan al TreeView

3) En el formulario hijo implementá una nueva propiedad que te permita el acceso al TreeView:
En el hijo:
Código: Text
  1. public TreeView MiTreeView
  2.         {
  3.             get
  4.             {
  5.                 return miTreeView;
  6.             }
  7.         }
  8.  
Desde el padre:
Código: Text
  1. formulario.MiTreeView.Nodes.Add("Nuevo Nodo");
  2.  

Voto por la tercera.

Un saludo
Título: Re: Accesar a controles de un form hijo
Publicado por: lalo_soft en Jueves 3 de Julio de 2008, 22:42
Código: Text
  1.  
  2. foreach(Form childForm in MdiChildren)
  3.  {
  4.    if(childForm.Text == "Admin")
  5.    {
  6.      childForm.Activate();
  7.      foreach(Control control in this.ActiveMdiChild.Controls)
  8.      {
  9.        if(control is TreeView)
  10.           {
  11.             TreeView tree = (TreeView)control;
  12.              saveTree(tree,saveProyect.FileName);
  13.              break;
  14.           }
  15.     }
  16.   }
  17.  }  
  18.  
  19.  

Lo solucione de esta mejor forma y no necesita cambiar ningun control de formChild  a Public, Gracias de todos modos Mollense  :good:
Título: Re: Accesar a controles de un form hijo
Publicado por: Mollense en Jueves 3 de Julio de 2008, 22:51
En las dos últimas variantes que te dí tampoco necesitas cambiar ningún control a "public" y no necesitas recorrer todos los controles ni depender del Text del formulario.
Sigo prefiriendo agregar una propiedad al formulario Hijo, porque me parece la manera mas limpia de hacerlo:

En el hijo:
Código: Text
  1. public TreeView MiTreeView
  2. {
  3.     get
  4.     {
  5.         return miTreeView;
  6.     }
  7. }
  8.  
Y en el padre:
Código: Text
  1. saveTree(miFormulario.MiTreeView,saveProyect.FileName);
  2.  

Saludos
Título: Re: Accesar a controles de un form hijo
Publicado por: lalo_soft en Jueves 3 de Julio de 2008, 23:39
Mmmmm! pero  tendrias que crear una nueva instancia del form hijo, y con ello no tendras aceso al control que esta en el form hijo ya anteriormente desplegado, o me equivoco?
Título: Re: Accesar a controles de un form hijo
Publicado por: Mollense en Viernes 4 de Julio de 2008, 00:05
Cita de: "lalo_soft"
Mmmmm! pero  tendrias que crear una nueva instancia del form hijo, y con ello no tendras aceso al control que esta en el form hijo ya anteriormente desplegado, o me equivoco?
No, el tema es no perderla a la hora de crearla por primera vez ;)
Título: Re: Accesar a controles de un form hijo
Publicado por: lalo_soft en Viernes 4 de Julio de 2008, 00:27
Cita de: "Mollense"
Cita de: "lalo_soft"
Mmmmm! pero  tendrias que crear una nueva instancia del form hijo, y con ello no tendras aceso al control que esta en el form hijo ya anteriormente desplegado, o me equivoco?
No, el tema es no perderla a la hora de crearla por primera vez ;)

Osea, que tendria que tener una especie de array con las referencias de los form hijos que se van creando en tiempo de ejecucion? como se ase tal array :mellow:
Título: Re: Accesar a controles de un form hijo
Publicado por: Mollense en Viernes 4 de Julio de 2008, 06:10
Cita de: "lalo_soft"
Cita de: "Mollense"
Cita de: "lalo_soft"
Mmmmm! pero  tendrias que crear una nueva instancia del form hijo, y con ello no tendras aceso al control que esta en el form hijo ya anteriormente desplegado, o me equivoco?
No, el tema es no perderla a la hora de crearla por primera vez ;)

Osea, que tendria que tener una especie de array con las referencias de los form hijos que se van creando en tiempo de ejecucion? como se ase tal array :mellow:
Y bueno, eso depende de cada sistema, no se como estés creando tus formularios. Una forma genérica de manejarlos sería por medio de un diccionario:
Código: Text
  1. public partial class FormularioPadre : Form
  2.     {
  3.         [b]private Dictionary<string, FormHijo> formularios = new Dictionary<string, FormHijo>();[/b]
  4.  
donde FormHijo debería ser un Form que implemente la propiedad que te dije antes.
Cada vez que crees un formulario hijo lo hacés de esta forma:
Código: Text
  1. formularios.Add("NombreDelForm",new FormHijo()); //Si todos los formularios hijos son iguales, si no lo son, cada formulario debería heredar de FormHijo, heredando de esta forma la propiedad "MiTreeView"
  2.             formularios["NombreDelForm"].MdiParent = this;
  3.             formularios["NombreDelForm"].Show();
  4.  

Cuando quieras acceder a alguno:
Código: Text
  1. formularios["NombreDelForm"].MiTreeView.Nodes.Add("Nuevo Nodo");
  2.  

No se si me explico
Título: Re: Accesar a controles de un form hijo
Publicado por: lalo_soft en Domingo 6 de Julio de 2008, 16:57
Si,gracias entendi el concepto  :good: