Pues eso… aquí te voy a explicar cómo usar un mismo control en más de un "contenedor" (o colección de controles), y como comprobarás, en principio, es algo muy simple de hacer (una vez que se sabe cómo hacerlo, claro, que si no… ¡ja! ya me dirás tú cómo lo harías si nadie lo explicara, pues eso…)
Sí, es un tema técnico… 😉 pero eso no quiere decir que no lo empiece cómo "debe ser".
A lo que vamos, de lo que se trata es de tener, por ejemplo, un control PictureBox y ese mismo control mostrarlo (o usarlo) en controles diferentes.
En realidad en contenedores de controles o colecciones de controles, que para el caso es lo mismo, además de que en .NET todos los controles pueden tener otros controles dentro (al menos eso es lo que parece o hace suponer al existir en cada objeto de tipo Control una propiedad llamada Controls que es un objeto del tipo ControlCollection (para saber más pulsa en los enlaces y te llevará a la documentación de .NET Framework 4.0).
Para lograr eso lo que tenemos que hacer es añadir el control en cuestión a la colección Controls del contenedor al que lo queremos mover.
Por ejemplo, si tenemos un control del tipo TabControl y cuando pulsamos en la primera y/o la segunda ficha (TabPage), haremos que un control llamado PictureBox1 se añada a esa ficha.
Con el siguiente código (para Visual Basic) lo conseguiremos:
Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As EventArgs) _ Handles TabControl1.SelectedIndexChanged Select Case TabControl1.SelectedIndex Case 0 TabPage1.Controls.Add(PictureBox1) Case 1 TabPage2.Controls.Add(PictureBox1) End Select End Sub
Si prefieres usar C#, utiliza el siguiente código:
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { switch (tabControl1.SelectedIndex) { case 0: tabPage1.Controls.Add(pictureBox1); break; case 1: tabPage2.Controls.Add(pictureBox1); break; } }
Si en lugar de añadirlo directamente a una ficha (tabControl) necesitas que esté en otro contenedor, por ejemplo, dentro de un GroupBox, simplemente sustituye el nombre del control que hay justamente antes de Controls.Add por el control que te convenga. Lo mismo ocurre con el control añadido (el que está entre paréntesis después de .Add), puedes añadir cualquier control.
Si al ver el código de ejemplo te preguntas algo así:
P: Guille, ¿no crees que sería necesario quitar el control antes de añadirlo a otra colección? ya que de esa forma tendríamos repetido el mismo control en más de una colección.
La respuesta podría ser como esta:
R: Buena pregunta, lo que indica que "has leído el código", pero no es necesario.
¿Por qué no es necesario eliminar un control de una colección antes de añadirla a otra?
Porque el propio .NET se encarga de eso, es decir, si un control se añade a una colección de controles, automáticamente se quita de la que ya estuviera.
Esto no es que lo haya "adivinado" yo, es que está en la documentación del método Add, que por cierto yo no lo había leído hasta después de hacer el proyecto de ejemplo, en el que me dio por probar a ver qué pasaba si no eliminaba previamente el control de la colección, y al ver que no ocurría "nada raro" (es decir, todo funcionaba como debería funcionar) me dio por leer la documentación y esa documentación tiene una nota que dice:
Un objeto Control sólo se puede asignar a una colección Control.ControlCollection a la vez. Si el Control ya es secundario de otro control, se quita de ese control antes de agregarlo a otro.
(el texto anterior está extraído de la ayuda en línea de .NET Framework 4.0 en castellano, concretamente de la definición del método Add de la clase Control.ControlCollection)
Espero que te sea de utilidad.
Nos vemos.
Guillermo
Publicado con fecha del lunes 16 de mayo a las 22:00, pero en realidad lo acabé de escribir (y publicar) el martes 17 de mayo a las 00:05
…
Muy buena esa opción, me recordó los tiempos en que programaba en Visual FoxPro que se hacÃa algo parecido. Enhorabuena Gulle, gracias.