Programacion Visual - Tema 5 - Formularios y Controles Multiples

download Programacion Visual - Tema 5 - Formularios y Controles Multiples

of 19

Transcript of Programacion Visual - Tema 5 - Formularios y Controles Multiples

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    1/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 1 | 19

    Manejo de Formularios MDI con C#

    Antes de iniciar debemos aclarar que existen dos tipos de Formularios:SDI (Single Document Interface)MDI (Multiple Document Interface)

    Los Formularios MDI son aquellos que permiten contener otros formularios dentro de ellos.

    Para crear una aplicacin de tipo MDI primeramente tenemos que crear nuestro proyecto(Aplicacin de Windows).En el formulario principal debemos establecer la propiedad IsMdiContainer a True.

    Formulario Principal

    Posteriormente debemos Crear el formulario base que ser la plantilla que tendrn nuestrosformularios child. En nuestro caso hemos tratado de simular un editor de texto bastante simplepero con soporte MDI.

    Agregamos un nuevo formulario a nuestro proyecto.

    Agregamos un primer panel en la parte inferior que podr contener botones si as lo deseamos,para hacer eso establecemos la propiedad Dock del panel en Bottom.

    Despus agregamos un segundo panel que contendr nuestro cuadro de texto y establecemos lapropiedad Dock en Fill.

    http://4.bp.blogspot.com/-9cMIFDKq2j4/TxWjjxcTCpI/AAAAAAAAAbo/qL8VawZqC90/s1600/2.pnghttp://1.bp.blogspot.com/-qoJa7Sw7zjE/TxWhfa6f7QI/AAAAAAAAAbg/WTGnDuwu1y0/s1600/1.png
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    2/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 2 | 19

    Agregamos nuestro textbox y lo renombramos a txtBoxContent y establecemos supropiedad Docken Fill.

    Agregamos un botn al panel de la parte inferior que sera la simulacin de un botn que servirpara guardar nuestro documento. Con esto tendremos nuestro formulario base.

    http://3.bp.blogspot.com/-zDCwtakzHfY/TxWlSllBRwI/AAAAAAAAAb4/SuGyeZHyUHU/s1600/4_3.pnghttp://2.bp.blogspot.com/-KQCVTEFaXds/TxWlUDSJ51I/AAAAAAAAAcE/gWAezP_QQ-s/s1600/4_2.pnghttp://2.bp.blogspot.com/-aqwZKP5spWg/TxWlTGld24I/AAAAAAAAAcA/stOUSJZ-4iM/s1600/4_1.pnghttp://4.bp.blogspot.com/-qTYMtklzA7s/TxWkfsP7bkI/AAAAAAAAAbw/7tdLeBKFi4Q/s1600/3.png
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    3/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 3 | 19

    Formulario Base

    Ahora crearemos un men para tener una administracin muy sencilla de las ventanas child (enel formulario Principal). Observemos que la opcin "Lista ->" no tiene subelementos ya que loscrearemos en tiempo de ejecucin

    .

    Para crear ventanas nuevas manejaremos el evento clic del men Nueva Ventana.Debemos crear un nuevo objeto de nuestro formulario base (en nuestro caso FrmChildBase) yestablecer su propiedad MdiParent.

    Cdigo para agregar nuevos formularios Child

    http://1.bp.blogspot.com/-IDvH7Bar8o8/TxWoosiMIjI/AAAAAAAAAcg/mwxRIjcX-r0/s1600/7.pnghttp://2.bp.blogspot.com/-Kh3Ic3kCVNU/TxWoTPRDQxI/AAAAAAAAAcY/Pklm0HFaDQ8/s1600/6.pnghttp://2.bp.blogspot.com/-tAg7-3f5SdI/TxWn4cw0JVI/AAAAAAAAAcQ/rwjIFVBmaFA/s1600/5.png
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    4/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 4 | 19

    Para ordenar nuestras ventanas debemos de manejar el evento clic de nuestro Men Horizontal,Vertical y Cascada. Para cambiar el ordenamiento de las ventanas existe la funcinLayoutMdi()que acepta una enumeracin MdiLayout. Aqu el ejemplo de las 3 opciones:

    Una gran utilidad es el saber que ventana se encuentra activa, para eso existe la propiedadActiveMdiChildque nos devuelve el formulario que se encuentra activo. En nuestro ejemplomanejaremos el evento clic del men Ventana Activa y tendremos este cdigo:

    Tambin podemos tener referencia al control activo con la propiedad ActiveControl denuestro formulario activo.

    Por ultimo para poder listar los formularios child que se encuentran activos manejaremos elevento MouseEnter de nuestro men Lista. Esto har que cada vez que pase el mouse sobre elmen Lista se obtenga una referencia de todos los formularios child y se agreguen de formadinmica al men. Esto gracias a la propiedad MdiChildren de nuestro formulario principal.La propiedad MdiChildren nos devuelve un arreglo de formularios.

    http://4.bp.blogspot.com/-uy_ykBpLMp8/TxWsbYslzbI/AAAAAAAAAc4/1UHTegT3s5k/s1600/10.pnghttp://3.bp.blogspot.com/-v9flH9uleq4/TxWsJSI_iSI/AAAAAAAAAcw/V351s5O62Kw/s1600/9.pnghttp://3.bp.blogspot.com/-tMbnhEgGZu8/TxWr8fC4LdI/AAAAAAAAAco/bc_0PC6arK4/s1600/8.png
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    5/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 5 | 19

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    6/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 6 | 19

    Forms en paneles

    Lo primero que vamos a hacer es crear un proyecto de tipo Windows Forms, a este le vamos aagregar tres Forms (Padre, Hijo1, Hijo2):

    Al formulario Padre, le vamos a agregar dos botones (btMostrarHijo1, btMostrarHijo2) y unpanel (panelContenedor), as:

    Y en los Forms hijos agregamos etiquetas grandes y distintivas (o lo que quieras agregar), as:

    https://nicolocodev.files.wordpress.com/2011/07/img2.jpghttps://nicolocodev.files.wordpress.com/2011/07/img1.jpg
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    7/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 7 | 19

    Ahora, en el lado que nos gusta (el lado del cdigo) veamos cmo implementar estos formulariosen el panel, en el evento click del botn btMostrarHijo1agregamos el siguiente cdigo:

    1234567

    89101112

    privatevoidbtMostrarHijo1_Click(objectsender, EventArgs e){

    if(this.panelContenedor.Controls.Count > 0)this.panelContenedor.Controls.RemoveAt(0);

    Hijo1 form =Application.OpenForms.OfType().FirstOrDefault();

    Hijo1 hijo1 = form ?? newHijo1();hijo1.FormBorderStyle = FormBorderStyle.None;hijo1.Dock = DockStyle.Fill;this.panelContenedor.Controls.Add(hijo1); this.panelContenedor.Tag = hijo1;hijo1.Show();

    }

    La explicacin de cmo funciona este cdigo es muy simple, primero preguntamos si existealgn control en el interior del panel, de ser verdadero lo eliminamos. Luego creamos una nuevainstancia del formulario a agregarLuego preguntamos si existe algn formulario del tipo Hijo1que ya este abierto, si existe usamos esa misma instancia, de lo contrario creamos una nueva ysobre este objeto reescribimos algunas de sus propiedades, TopLevelestablece si el formulario

    debe mostrarse como ventana nivel superior, FormBorderStyledefine el estilo de los bordes denuestro formulario (en nuestro caso no queremos mostrarlos), Dockestablece como se acoplara elcontrol a su contenedor principal (en nuestro caso queremos que rellene todo el panel), Porultimo lo agregamos al panel, establecemos la instancia como contenedor de datos de nuestropanel y lo mostramos, el resultado se ver as:

    https://nicolocodev.files.wordpress.com/2011/07/img3.jpg
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    8/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 8 | 19

    Y si tengo 50 botones en mi formulario padre, tengo que escribir todo este cdigo 50 veces? Larespuesta es NO, por fortuna para nosotros podemos escribir un mtodo que nos ahorre a un ms

    el trabajo, en nuestro caso crearemos un mtodo void (sin retorno de datos) que recibir comoparmetro la instancia del Formulario a mostrar, as:

    12345678

    91011

    privatevoidAddFormInPanel(Form fh){

    if(this.panelContenedor.Controls.Count > 0)this.panelContenedor.Controls.RemoveAt(0);

    fh.TopLevel = false;fh.FormBorderStyle = FormBorderStyle.None;fh.Dock = DockStyle.Fill;this.panelContenedor.Controls.Add(fh); this.panelContenedor.Tag = fh;fh.Show();

    }

    Y para acudir a este, desde el evento click del botn lo hacemos as:

    12345

    6

    privatevoidbtMostrarHijo2_Click(objectsender, EventArgs e){

    varform = Application.OpenForms.OfType().FirstOrDefault();Hijo2 hijo = form ?? newHijo2();AddFormInPanel(hijo);

    }

    https://nicolocodev.files.wordpress.com/2011/07/img4.jpg
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    9/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 9 | 19

    CREANDO ARRAY DE CONTROLES CON SUS EVENTOS

    Para una aplicacin necesit tener siete CheckBoxes en un formulario indicando los das de la

    semana. Tambin tengo un array de variables booleanas llamado "dias" cuyos ndices (0,1,2,3,4,5,6)representan los das de la semana (L,M,M,J,V,S,D) respectivamente (en C# los ndices de los arrays

    empiezan siempre desde cero). Si selecciono el CkeckBox de los das lunes y mircoles solamente, lasvariables dias[0] y dias[2] toman el valor de true, el resto de variables "dias" sern false (en la

    prctica necesitaba el array "dias" para pasrselo a otra clase y luego usarlo para modificar unos

    campos en una BD...)

    Esta vez, en lugar de crear cada CheckBox con el diseador del Visual Studio quise crearlos como

    elementos de un array de CheckBoxes. Para este tutorial tambin voy a crear un array de TextBoxesy otro de Buttons.

    La declaracin para crear los arrays es como sigue:

    Mirando cmo el diseador del Visual Studio declara y asigna las propiedades a los controles, hice lo

    mismo para mis arrays de controles, pero dentro de un bucle. Aqu muestro la funcin que crea losCheckBoxes:

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    10/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 10 | 19

    Dentro del bucle asigno los delegados para los eventos respectivos de cada control. Para saber cul

    control del array es el que lanza el evento debo examinar el objeto "sender" que es el control quien

    "enva" o lanza el evento. Para saber el ndice del control dentro del array lo almaceno en unapropiedad del control: puede ser el nombre, el TabIndex, o el Tag. En realidad puede ser cualquier

    propiedad cuyo valor no vamos a modificar a lo largo de la aplicacin, ya que desde la cual vamos asaber el ndice del control dentro del array.

    Un dato interesante acerca de los eventos es que estos no se ejecutan al declararlos dentro delbucle que crea los controles. Aqu slo declaramos el evento y lo asignamos a su respectivo control,

    el evento recin se ejecuta cuando el control lo "lanza" (es decir: cuando se ejecuta la accin que

    llama al evento. Esto me ha recordado un poco a la "Evaluacin Perezosa" de la programacinfuncional, no s si ser exactamente lo mismo, pero se le parece mucho).

    Las dos lneas con el comentario "poned un breakpoint ac" hacen exactamente lo mismo: Si deseoleer el ndice guardado en el nombre del control que lanza el evento, utilizo la variable "n", o ms

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    11/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 11 | 19

    directamente puedo leer el ndice usando la propiedad "Tag". Ambas lneas de cdigo cambian el

    valor del elemento con ndice "n" ndice "Tag" (ambos tienen el mismo valor) del array "dias" averdadero falso, segn sea el valor de la propiedad "Checked" del CheckBox con ndice "n" "Tag"dentro del array de ChackBoxes.

    Y esta es la funcin de los TextBoxes:

    En el caso de los TextBoxes, mandarn un saludo al texto de su formulario (el cual se llama "Form1")al recibir el cursor (el ndice del respectivo TextBox se lee desde la propiedad "Tag"):

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    12/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 12 | 19

    Si se pone un punto de quiebre en las lneas donde dice "poned un breakpoint ac" se podr ver cmo

    la ejecucin del programa "salta" a la declaracin del evento para cambiar los valores a los elementos

    del array "dias" cuando se pone o quita el "check" de los CheckBoxes.

    Y qu sucede si deseo enviar mensajes a otros formularios?Debo crear un delegado y su respectivoevento:

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    13/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 13 | 19

    Tambin debo crear el otro formulario que va a recibir los mensajes. Lo he llamado Form2, sloposee un label llamado "label1" y ste es su cdigo:

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    14/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 14 | 19

    Ahora voy a crear un array de botones en Form1 con los que le mandar mensajes a Form2:

    Debo tener cuidado de evaluar que mi evento "Enviar" no sea nulo o lanzar una excepcin. Estoocurre si Form2 no se ha cargado. Luego aado un botn desde la barra de herramientas del VisualStudio con el que abrir Form2:

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    15/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 15 | 19

    El cdigo del nuevo botn (llamado btnForm2) es::

    Si ejecuto la aplicacin, y abro tambin Form2, se ver cmo recibe los mensajes desde los botonescreados en el array:

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    16/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 16 | 19

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    17/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 17 | 19

    Recorrido de todos los controles en un Form C# y VB.NET

    Hace un tiempo trabaj en un proyecto en el cual quera "formatear" a los controles de unformulario, para poder ofrecer al usuario un "skin" o un tema a la aplicacin, por ejemplo, quetodos los controles 'label' de un formulario se colorearan de color azul, para eso lo tena que

    hacer dinmicamente, ya que tena varios formularios en la misma aplicacin, y algunoscargados de distintos tipos de controles.

    El recorrido de controles, se puede hacer de 2 maneras:

    1. Recorriendo de manera Iterativa los controles de un control. En esta forma, slo podemosrecorrer los controles hijos de un control padre, por ejemplo, si tenemos un Form, y queremosaplicar este recorrido, entonces unicamente se recorrer todos los controles que estndirectamente agregados en el formulario y no dentro de otro control, es decir, si tenemos 3controles dentro del Form: 1 Label, 1 GroupBox y 1 Button, pero el Label se encuentra dentrodel Group Box, al hacer este recorrido, no afectar al Label, sino solo al Button y al GroupBox.

    Suponiendo que tenemos este formulario, en estetipo de recorrido, cuando queramos recorrer todos los controles que tenemos en el Form1, solorecorreremos a GroupBox1 y a Button1.

    2. Recorriendo de manera RecursivaTODOS los controles de un control. En esta forma sepodrn recorrer todos y cada uno de los controles que esten dentro de un control padre, ancuando algunos controles estn dentro de otro y ste a su vez de otro (esto se conoce comocontroles anidados), mientras formen parte del mismo control padre que establecemos, se hardicho recorrido. sta es la mejor manera de hacerlo, cuando se trate de recorrer de maneraDINMICA, es decir, cuando no se conoce ni dnde, ni cuntos controles vamos a recorrer.Cuando conozcamos su ubicacin, o su tamao, y sabemos que NO VA A CAMBIAR en el

    http://4.bp.blogspot.com/_7Bw6Jfx_RZU/SgMhdaa1KTI/AAAAAAAAAAM/1Y2z_dQoGV8/s1600-h/form1.bmp
  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    18/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 18 | 19

    transcurso de vida de nuestra aplicacin, entonces no conviene hacer un recorrido Recursivo detodos, sino almacenarlos en una coleccin y ah hacer el recorrido, este tipo de recorrido es sobreuna coleccin de elementos, en la cual conocemos su tamao (esto lo explicar mas adelante).

    Cdigo:

    1. Recorriendo de manera Iterativa

    C#

    //Recorremos con un ciclo for each cada control que hay en la coleccion Controls de un objetollamado 'control'

    foreach(Control contHijo incontrol.Controls){

    //Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo detodos los controles

    contHijo.BackColor = Color.Blue;

    }

    VB.NET

    'Recorremos con un ciclo for each cada control que hay en la coleccion Controls de un objetollamado 'control'

    For EachcontHijo AsControl Incontrol.Controls

    'Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo detodos los controlescontHijo.BackColor = Color.Blue

    Next

    2. Recorriendo de manera Recursiva

    C#

    public voidRecControles(Controlcontrol) {//Recorremos con un ciclo for each cada control que hay en la coleccin Controlsforeach(ControlcontHijo incontrol.Controls){

  • 7/25/2019 Programacion Visual - Tema 5 - Formularios y Controles Multiples

    19/19

    Progamacion Visual TEMA 5 FORMULARIOS Y CONTROLES MULTIPLES

    P g i n a 19 | 19

    //Preguntamos si el control tiene uno o mas controles dentro del mismo con la propiedad'HasChildren'//Si el control tiene 1 o ms controles, entonces llamamos al procedimiento de forma recursiva,para que siga recorriendo los dems controlesif(contHijo.HasChildren) this.RecControles(contHijo);

    //Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo detodos los controlescontHijo.BackColor = Color.Blue;}}

    VB.NET

    Public SubRecControles(ByValcontrol AsControl)

    'Recorremos con un ciclo for each cada control que hay en la coleccin Controls

    For EachcontHijo AsControl Incontrol.Controls'Preguntamos si el control tiene uno o mas controles dentro de l mismo con la propiedad'HasChildren''Si el control tiene 1 o ms controles, entonces llamamos al procedimiento de forma recursiva,para que siga'recorriendo los dems controlesIfcontHijo.HasChildren ThenMe.RecControles(contHijo)

    'Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo detodos los controlescontHijo.BackColor = Color.Blue

    NextEnd Sub

    Como se dan cuenta, en el recorrido de forma recursiva, se debe hacer uso de un procedimientoque haga el recorrido (de ah su nombre, una funcin [o procedimiento] que se llama a s misma,mientras que de manera iterativa lo puedes utilizar en tu cdigo de funcin o procedimiento sinnecesidad de declarar otra funcin alterna.

    Ahora bien, esto lo hace de maravilla, y est bien hacerlo cuando NO conozcamos el tamao nila ubicacin de los controles, ya que como ven, el recorrido pasa por TODOS los controles de uncierto control, pero... y qu pasa si slo necesito los controles 'Button' que se encuentran en unformulario que, de antemano, s que no voy a agregar otros controles, pues entonces lo queconviene es que realices una coleccin de esos botones y hagas el recorrido UNICAMENTE enesos controles. La coleccin la puedes hacer en un Array, en un objeto Collection, etc.