none
Cambiar propiedades desde el formulario activo a otro formulario RRS feed

  • Pregunta

  • Cordial saludo...


    Deseo realizar cambios a las propiedades de los controles en tiempo de ejecución pero desde otro formulario, es decir desde el formulario principal (formulario al que le quiero cambiar las propiedades de los controles) abro un formulario 2 (formulario que tiene los parámetros de configuración que quiero cambiar del formulario 1). Lo deseo realizar en tiempo real, es decir si desde el formulario 2 cambio algún parámetro como color, tamaño, texto, etc. automáticamente actualice la configuración en el formulario 1.

    para dar ideas he intentado hacerlo con este código que me funciona perfectamente para obtener los valores de otro form pero no me funciona para modificar:

    (Label)Form1.Controls["label1"]).BackColor = Color.Black;

     

    me imagino que será porque tengo que realizar una nueva instancia del formulario Form1, por lo tanto no me cambia el valor al formulario ya instanciado.

    Me gustaría que alguien me pudiera ayudar brindándome códigos de ejemplo o ideas, muchas gracias...

    viernes, 6 de noviembre de 2009 21:01

Respuestas

  • Hola, Yonatan:

    Añade un parámetro del tipo Form1 al constructor por defecto del formulario Form2:

        public partial class Form2 : Form
        {
            private Form1 m_frm;

            public Form2(Form1 frm)
            {
                InitializeComponent();

                m_frm = frm;
            }

        }

    Cuando desees cambiar las propiedades del objeto Form pasado en el argumento, simplemente modificarías las propiedades del campo m_frm:

                m_frm.BackColor = Color.AliceBlue;
                m_frm.Text = "Nuevo Título";
                m_frm.Location = new Point(30, 30);
                m_frm.Controls["label1"].BackColor = Color.Black;

    Ahora, para llamar al formulario Form2 desde el formulario Form1, lo harías de la siguiente manera:

                Form2 frm = new Form2(this);
                frm.ShowDialog();
                frm.Dispose();

    Un saludo


    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Yonatan Román lunes, 9 de noviembre de 2009 20:48
    sábado, 7 de noviembre de 2009 16:10
  • hola

    Te recomendaria que para acceder de un formulario a otro no utilices el acceso directo a este como lo ahces, esto es debido a que generas un gran acoplamiento entre cada forma al trabajarlo de esta forma

    Para comunicar el form padre con sus hijos, te aconsejaria que uses propiedades, o sea creas una propiedad en el form hijo del tipo

    public Color SetTextBoxColor
    {
        set{
              TextBox1.BackColor = value;
        }
    }

    como veras por emdio de las propiedades abstraes y controlas el acceso al formulario, ademas no generas un acoplamiento con un control de cada formulario

    Por ahi el tema aqui sera el team de obtener la instancia de cada form ya que si la accedes cuando la creas es simple

    Form2 form2 = new Form2();
    form2.SetTextBoxColor = Color.Red;
    form2.Shor();

    en este caso es simple porque tienes la instancia del form hijo antes de abrirlo.

    Iguals e podrias solucionar manteniendo una lista de formulario abiertos desde el form padre y si quiere acceder a uno en particular buscarlo por nombre

    o sino con esta propeidad Application.OpenForms


    Si quieres comunicar el form hijo con su padre podrias hacerlo de esta forma:

    Comunicar formularios de forma desacoplada

    Comunicar formularios MDI


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Yonatan Román lunes, 9 de noviembre de 2009 20:48
    viernes, 6 de noviembre de 2009 22:01
  • Hola Yonatan:

    En tu caso sea cual sea la solución que implementes, yo cuidaría mucho las responsabilidades.... Form2 no "debe" modificar las propiedades de Form1, en todo caso, debería decirle a Form1 que las modifique...

    Me explico..

    Si tu pasas una instancia de Form1 a Form2 y desde Form2 realizas los cambios sobre Form1, primero estarás violando los mecanismos de encapsulación en programación orientada a objetos... "Ningun objeto modifica directamente el contenido de otro objeto" y segundo, si luego tienes un Form3 donde también necesitas modificar los valores de Form1, entonces tendrás que repetir todo el código que has escrito en Form2...

    La solución que deberías plantearte es que Form1 Tenga métodos públicos como CambiarColor(Color nuevo) o CambiarLetra(...) y desde cualquier formulario puedas llamar a estos métodos. De esta forma el código que modifica a Form1 estará siempre en Form1...

    Salu2

    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise 3.5.

    Mi perfil: www.odelvalle.com
    Colaborador: www.secondnug.com
    • Marcado como respuesta Yonatan Román lunes, 9 de noviembre de 2009 20:48
    lunes, 9 de noviembre de 2009 8:36
    Moderador

Todas las respuestas

  • hola

    Te recomendaria que para acceder de un formulario a otro no utilices el acceso directo a este como lo ahces, esto es debido a que generas un gran acoplamiento entre cada forma al trabajarlo de esta forma

    Para comunicar el form padre con sus hijos, te aconsejaria que uses propiedades, o sea creas una propiedad en el form hijo del tipo

    public Color SetTextBoxColor
    {
        set{
              TextBox1.BackColor = value;
        }
    }

    como veras por emdio de las propiedades abstraes y controlas el acceso al formulario, ademas no generas un acoplamiento con un control de cada formulario

    Por ahi el tema aqui sera el team de obtener la instancia de cada form ya que si la accedes cuando la creas es simple

    Form2 form2 = new Form2();
    form2.SetTextBoxColor = Color.Red;
    form2.Shor();

    en este caso es simple porque tienes la instancia del form hijo antes de abrirlo.

    Iguals e podrias solucionar manteniendo una lista de formulario abiertos desde el form padre y si quiere acceder a uno en particular buscarlo por nombre

    o sino con esta propeidad Application.OpenForms


    Si quieres comunicar el form hijo con su padre podrias hacerlo de esta forma:

    Comunicar formularios de forma desacoplada

    Comunicar formularios MDI


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Yonatan Román lunes, 9 de noviembre de 2009 20:48
    viernes, 6 de noviembre de 2009 22:01
  • Hola, Yonatan:

    Añade un parámetro del tipo Form1 al constructor por defecto del formulario Form2:

        public partial class Form2 : Form
        {
            private Form1 m_frm;

            public Form2(Form1 frm)
            {
                InitializeComponent();

                m_frm = frm;
            }

        }

    Cuando desees cambiar las propiedades del objeto Form pasado en el argumento, simplemente modificarías las propiedades del campo m_frm:

                m_frm.BackColor = Color.AliceBlue;
                m_frm.Text = "Nuevo Título";
                m_frm.Location = new Point(30, 30);
                m_frm.Controls["label1"].BackColor = Color.Black;

    Ahora, para llamar al formulario Form2 desde el formulario Form1, lo harías de la siguiente manera:

                Form2 frm = new Form2(this);
                frm.ShowDialog();
                frm.Dispose();

    Un saludo


    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Yonatan Román lunes, 9 de noviembre de 2009 20:48
    sábado, 7 de noviembre de 2009 16:10
  • Hola Yonatan:

    En tu caso sea cual sea la solución que implementes, yo cuidaría mucho las responsabilidades.... Form2 no "debe" modificar las propiedades de Form1, en todo caso, debería decirle a Form1 que las modifique...

    Me explico..

    Si tu pasas una instancia de Form1 a Form2 y desde Form2 realizas los cambios sobre Form1, primero estarás violando los mecanismos de encapsulación en programación orientada a objetos... "Ningun objeto modifica directamente el contenido de otro objeto" y segundo, si luego tienes un Form3 donde también necesitas modificar los valores de Form1, entonces tendrás que repetir todo el código que has escrito en Form2...

    La solución que deberías plantearte es que Form1 Tenga métodos públicos como CambiarColor(Color nuevo) o CambiarLetra(...) y desde cualquier formulario puedas llamar a estos métodos. De esta forma el código que modifica a Form1 estará siempre en Form1...

    Salu2

    MCTS ADO.NET, MCTS WCF, MCTS WinForm, MCTS ASP.NET, MCPD Enterprise 3.5.

    Mi perfil: www.odelvalle.com
    Colaborador: www.secondnug.com
    • Marcado como respuesta Yonatan Román lunes, 9 de noviembre de 2009 20:48
    lunes, 9 de noviembre de 2009 8:36
    Moderador