none
Modificar metodo InitializeComponent() RRS feed

  • Pregunta

  • Hola estoy empezando en c# y me he encontrado que los controles al crearse en el metodo InitializeComponent() no tienen la propiedad "Tag" La cual es necesaria para el algoritmo que estoy desarrollando. Utilizo el Tag como identificador de algunos controles del form. Sin embargo al recorrer los controles me sale el errorr:"Referencia a objeto no establecida como instancia de un objeto" cuando verifico con este codigo de ejemplo:

    MessageBox.Show(control.Tag.Tostring());

    control es cualquier control del form. 

    La solución que se me ocurrio es agregar la propiedad a cada control manualmente directamente en el metodo InitializeComponent() Sin embargo de poder hacerse seria con un bucle tomando en cuenta que son demasiados controles.

    Alguna idea?


    Renzo Rivera

    sábado, 13 de junio de 2020 3:05

Respuestas

  • No lo hagas dentro del InitializeComponent. Este método se sobreescribe cada vez que modificas el diseño del form, por lo que se perderían tus cambios. En su lugar, deja que se ejecute el InitializeComponent, y después ejecuta al código que quieras para modificar los controles que fueron inicializados dentro del InitializeComponent.

    Puedes hacer cosas como elNombreDelControl.Tag = "loQueSea";

    y si quieres hacerlo con un bucle, puedes recorrerlos mediante la colección Controls:

    foreach (Control c in this.Controls)
    {
        // Aquí haz lo que quieras con el control c, por ejemplo:
        if (c is Textbox)
        {
            // Solo es un ejemplo. Esto asignaría el mismo Tag a todos los textboxes.
            // No tienes por qué hacer esto
            ((TextBox)c).Tag = "Esto es un TextBox";
        }
    }
    

    • Propuesto como respuesta Sergio ParraModerator sábado, 13 de junio de 2020 13:52
    • Marcado como respuesta Renzo19 sábado, 13 de junio de 2020 15:22
    sábado, 13 de junio de 2020 7:00
    Moderador
  •  no tiene un valor asignado o esta null, surge el error de referencia no establecida. Si logro resolver eso tendría la solución a mi problema.

    Bueno, eso toda la vida se ha resuelto con un "if" que compare con null:

    if (b.Tag != null && b.Tag.ToString() == "500") ....

    O, si tienes una versión moderna de C#, puedes jugar con el operador ?.

    if (b?.Tag as string == "500") ....

    • Propuesto como respuesta Sergio ParraModerator sábado, 13 de junio de 2020 13:52
    • Marcado como respuesta Renzo19 sábado, 13 de junio de 2020 15:22
    sábado, 13 de junio de 2020 11:19
    Moderador

Todas las respuestas

  • No lo hagas dentro del InitializeComponent. Este método se sobreescribe cada vez que modificas el diseño del form, por lo que se perderían tus cambios. En su lugar, deja que se ejecute el InitializeComponent, y después ejecuta al código que quieras para modificar los controles que fueron inicializados dentro del InitializeComponent.

    Puedes hacer cosas como elNombreDelControl.Tag = "loQueSea";

    y si quieres hacerlo con un bucle, puedes recorrerlos mediante la colección Controls:

    foreach (Control c in this.Controls)
    {
        // Aquí haz lo que quieras con el control c, por ejemplo:
        if (c is Textbox)
        {
            // Solo es un ejemplo. Esto asignaría el mismo Tag a todos los textboxes.
            // No tienes por qué hacer esto
            ((TextBox)c).Tag = "Esto es un TextBox";
        }
    }
    

    • Propuesto como respuesta Sergio ParraModerator sábado, 13 de junio de 2020 13:52
    • Marcado como respuesta Renzo19 sábado, 13 de junio de 2020 15:22
    sábado, 13 de junio de 2020 7:00
    Moderador
  • Hola, ciertamente esto responde mi pregunta y me orienta mejor sobre que debo hacer sin embargo esto plantea otro problema lógico para lo que realmente quiero hacer. Te expongo este ejemplo:

     foreach (Control a in this.Controls)  //recorrer la colección de controles del form
                {
                    if (a.HasChildren )   //Si el control contiene otros controles dentro
                    {
                        foreach (Control b in a.Controls)  //Recorrer esos controles hijos
                        {
                            if (b.Tag.ToString() == "500")  //Si el tag del control hijo es "500"
                            {
                               MessageBox.Show(b.Tag.ToString()); //Mostrar el tag por mensaje
                            }
                        }
                    }
                    else   //Si el control esta directamente dentro del formulario pero no dentro de otro
                    {
                        if (a.Tag.ToString() == "600")   //Si el el tag del control es "600"
                        {
                            MessageBox.Show(a.Tag.ToString());   //Mostrar por mensaje
                        }
                    } 
                }
    El problema surge en el if ya que cuando encuentra un control que no tiene tag o bien no tiene un valor asignado o esta null, surge el error de referencia no establecida. Si logro resolver eso tendría la solución a mi problema.


    Renzo Rivera



    • Editado Renzo19 sábado, 13 de junio de 2020 8:14
    sábado, 13 de junio de 2020 8:11
  •  no tiene un valor asignado o esta null, surge el error de referencia no establecida. Si logro resolver eso tendría la solución a mi problema.

    Bueno, eso toda la vida se ha resuelto con un "if" que compare con null:

    if (b.Tag != null && b.Tag.ToString() == "500") ....

    O, si tienes una versión moderna de C#, puedes jugar con el operador ?.

    if (b?.Tag as string == "500") ....

    • Propuesto como respuesta Sergio ParraModerator sábado, 13 de junio de 2020 13:52
    • Marcado como respuesta Renzo19 sábado, 13 de junio de 2020 15:22
    sábado, 13 de junio de 2020 11:19
    Moderador
  •  

    Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

     

    lunes, 15 de junio de 2020 17:22
    Moderador
  • Gracias, ambas respuestas me ayudaron mucho. 

    Renzo Rivera

    martes, 16 de junio de 2020 1:43