locked
Evento enrutado para matrices, ¿es posible? RRS feed

  • Pregunta

  •   En primer lugar gracias por leerme. Trabajo en VS Express 2013.

     Mi problema es el siguiente: tengo un serie de Textbox[], y quiero que al salir de cada Textbox[i] (por tabulación o por hacer click fuera o en otro Textbox), se les aplique un método.

     Pongo un ejemplo cercano a lo que quiero hacer para que se entienda mejor.

    public MainPage()
            {
                  this.InitializeComponent();
                  tb.PointerExited += tb_PointerExited;
            }


    private void tb_PointerExited(object sender, RoutedEventArgs e)
            {
                tb.Text+="+";
            }

     Eso es lo que sé llegar a hacer. Pero quiero, en vez de aplicar el evento a un Textbox, aplicarselo a un Textbox[i] y si es posible, que el evento suceda al tabular o hacer click fuera de ese Textbox[i] (estos eventos no existen por definicion, creo.., y no se crearlos).

    Desde ya, muchas gracias!

    sábado, 26 de abril de 2014 19:26

Respuestas

  • Tendrás que recorrer la matriz entera conectando el evento con cada uno de sus items:

    foreach (TextBox t in nombreDeLaMatriz)
    {
        t.LostFocus += tb_LostFocus;
    }
    
    private void tb_LostFocus(object sender, RoutedEventArgs e)
    {
        ((TextBox)sender).Text+="+";
    }


    Como alternativa, podrías crear una clase heredada de TextBox, y dentro de esa clase hacer un override del método OnLostFocus, y meter ahi el tratamiento del evento. Después, en lugar de hacer una matriz de la clase TextBox, haces la matriz con la clase heredada de TextBox. De esa manera, todos los items tendrán el manejador del evento con independencia de que se añadan con posterioridad a la matriz.

    • Propuesto como respuesta Sergio Parra sábado, 26 de abril de 2014 20:27
    • Marcado como respuesta North King domingo, 27 de abril de 2014 17:29
    sábado, 26 de abril de 2014 19:37

Todas las respuestas

  • Tendrás que recorrer la matriz entera conectando el evento con cada uno de sus items:

    foreach (TextBox t in nombreDeLaMatriz)
    {
        t.LostFocus += tb_LostFocus;
    }
    
    private void tb_LostFocus(object sender, RoutedEventArgs e)
    {
        ((TextBox)sender).Text+="+";
    }


    Como alternativa, podrías crear una clase heredada de TextBox, y dentro de esa clase hacer un override del método OnLostFocus, y meter ahi el tratamiento del evento. Después, en lugar de hacer una matriz de la clase TextBox, haces la matriz con la clase heredada de TextBox. De esa manera, todos los items tendrán el manejador del evento con independencia de que se añadan con posterioridad a la matriz.

    • Propuesto como respuesta Sergio Parra sábado, 26 de abril de 2014 20:27
    • Marcado como respuesta North King domingo, 27 de abril de 2014 17:29
    sábado, 26 de abril de 2014 19:37
  •  Muchas gracias por tu respuesta Sergio.

     La primera alternativa es lo que buscaba, pero me surge otro problema debido a que la matriz de textbox[] no esta completamente definida. Me explico: al inicio de la aplicacion declaro una matriz Textbox[10] y solo defino dos Textbox; despues con un button(+) se van sumando mas Textbox. Por tanto, en vez de usar el "foreach", que me da un error, utilizo un "for" hasta el numero de Textbox definidos. Debido a este "for" solo se me activa el evento con los dos primeros Textbox definidos al inicio.

    App.tb = new Textbox[10]; App.puntos = 2; public MainPage() { this.InitializeComponent(); for (int i = 0; i < App.puntos; i++) { App.tb[i].LostFocus += tb_LostFocus; } } private void tb_LostFocus(object sender, RoutedEventArgs e) { // Entra aqui solo para los dos primeros tb ((TextBox)sender).Text += "+"; } private void bMas_Click(object sender, RoutedEventArgs e) { App.puntos++; }

    ¿Cómo hago para añadir los nuevos tb[] al evento?

    Saludos y muchas gracias

     

    domingo, 27 de abril de 2014 17:29
  • [...] la matriz de textbox[] no esta completamente definida. Me explico: al inicio de la aplicacion declaro una matriz Textbox[10] y solo defino dos Textbox; despues con un button(+) se van sumando mas Textbox.

    Si solo usas parte de la matriz, y luego le vas añadiendo items, te sugiero que en lugar de una matriz utilices un List<TextBox>. De esa manera es "flexible" y puede ir creciendo sobre la marcha sin que te tengas que preocupar de cuánto está ocupado hasta el momento.

    Pero en cuanto a lo de la conexión del evento: Lo razonable sería que justo en el momento de añadir el textbox al array aproveches y también le conectes el evento. Es decir, si en ese button(+) que mencionabas antes haces algo parecido a esto:

    App.tb[puntos++] = new TextBox();

    Basta con que lo cambies por esto:

    TextBox t = new TextBox();
    t.LostFocus += tb_LostFocus;
    App.tb[puntos++] = t;

    Y de esa manera ya no necesitas después hacer el for para conectarle los eventos a todos los textboxes del array (porque a cada uno de ellos ya se le conectó el evento en el momento de añadirlo al array).

    domingo, 27 de abril de 2014 19:20