none
No funciona FindName con controles generados dinámicamente RRS feed

  • Pregunta

  • Hola a todos. Ante todo, quiero disculparme por las meteduras de pata que pueda tener, porque soy novísimo en este lenguaje. Tengo una aplicación que genera controles de manera dinámica. Lo hace desde una clase (AppForms) que he añadido al proyecto. El problema es que luego FindName no consigue localizar los controles. Por supuesto, a cada control le asigno su propia identificación en el momento en que son creados, y de hecho he comprobado que tienen ese nombre. Pongo una función como ejemplo de lo que no me funciona. Al compilar, me dice que "No se controló NullReferenceException".

    public void tbxContactName_KeyDown(object sender, KeyEventArgs e)

    {

    Label lb = FindName("lbContactNameAd") as Label;

    lb.Visibility = System.Windows.Visibility.Hidden;

    }

    ¿Se os ocurre alguna forma de solucionalo?

    Gracias por adelantado y un saludo.


    • Editado Tortuguica viernes, 20 de noviembre de 2015 18:21
    viernes, 20 de noviembre de 2015 18:18

Respuestas

  • Hola Tortuguica, debes crear una extensión método para obtener todo el árbol de valores. Y podrás obtener el control que necesites. Cuando generas los controles dinámicamente no podrás obtener los datos porque no existen.

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile
    My code samples

    • Marcado como respuesta Tortuguica sábado, 21 de noviembre de 2015 12:20
    viernes, 20 de noviembre de 2015 19:39

Todas las respuestas

  • Hola Tortuguica, debes crear una extensión método para obtener todo el árbol de valores. Y podrás obtener el control que necesites. Cuando generas los controles dinámicamente no podrás obtener los datos porque no existen.

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile
    My code samples

    • Marcado como respuesta Tortuguica sábado, 21 de noviembre de 2015 12:20
    viernes, 20 de noviembre de 2015 19:39
  • Gracias por tu respuesta, Cristian. Lo siento, pero no sé qué es una extensión método (insisto en que soy un novato en WPF, de hecho estoy dándolo por primera vez este año en el instituto). No obstante, buscando por la red he encontrado este método

    public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
            {
                // Confirm parent and childName are valid. 
                if (parent == null)
                    return null;
    
                T foundChild = null;
    
                int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < childrenCount; i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    // If the child is not of the request child type child
                    T childType = child as T;
                    if (childType == null)
                    {
                        // recursively drill down the tree
                        foundChild = FindChild<T>(child, childName);
    
                        // If the child is found, break so we do not overwrite the found child. 
                        if (foundChild != null) break;
                    }
                    else if (!string.IsNullOrEmpty(childName))
                    {
                        var frameworkElement = child as FrameworkElement;
                        // If the child's name is set for search
                        if (frameworkElement != null && frameworkElement.Name == childName)
                        {
                            // if the child's name is of the request name
                            foundChild = (T)child;
                            break;
                        }
                    }
                    else
                    {
                        // child element found.
                        foundChild = (T)child;
                        break;
                    }
                }
    
                return foundChild;
            }


    Este método lo invoco, por ejemplo, así:

    TextBox addressTbx = FindChild<TextBox>(Application.Current.MainWindow, "tbxContactAddress");

    Y lo cierto es que funciona. ¿Crees que es correcto lo que estoy utilizando?

    Gracias de nuevo y un saludo.


    • Editado Tortuguica sábado, 21 de noviembre de 2015 12:20
    sábado, 21 de noviembre de 2015 12:19
  • Correctísimo. Es la forma de hacerlo. Esa es una extensión de método.

    Felicitaciones y a las órdenes.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile
    My code samples

    lunes, 23 de noviembre de 2015 11:16