none
Foreach: Recorrer Controles RRS feed

  • Pregunta

  • Visual C# 2010

    Hola a todos

    En un Contenedor (por ejemplo un Formulario) luego de agregar cuatro TextBox, es necesario recorrer dichos controles en orden y recuperar la información ingresada en ellos.

    Al utilizar la estructura For Each para tal propósito, el recorrido se hace en forma inversa al orden en que se hizo el ingreso de los Controles; es decir, primero se muestra la "info" del TextBox4, luego la del TextBox3 y así sucesivamente.

    ¿A qué se debe esto? y ¿Cómo solucionarlo?

    Desde ya Muchísimas Gracias


    Skar.2007

    miércoles, 2 de octubre de 2013 13:01

Respuestas

  • ¿Por qué al utilizar el For Each para recorrer los Controles mencionados se devuelven en orden inverso?

    en realidad tiene que ver por como fueran cargados en la coleccion cuando se inicia el form

    si agregas a la coleccion usando el Add() de atras hacia delante, cuando recuperes esa lista lo haras de esa misma forma como fueron asignado a la coleccion


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    viernes, 29 de noviembre de 2013 10:24

Todas las respuestas

  • un comentario, si usas el OfType<> porque no defines el foreach de forma tipada a ese control

    foreach (TextBox item in Controls.OfType<TextBox>().OrderBy(tb=>tb.TabIndex)){

    }

    digo que sea un textbox que represente cada item y no un control

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 2 de octubre de 2013 14:24
  • Gracias Leandro, disculpando la demora

    Una duda...

    ¿Por qué al utilizar el For Each para recorrer los Controles mencionados se devuelven en orden inverso?
    ¿Es posible que sea porque los Controles se "gestionan" en una Pila en Memoria Principal?

    Desde ya Muchísimas Gracias


    Skar.2007

    viernes, 29 de noviembre de 2013 7:59
  • Hola de nuevo Leandro

    ¿Y cómo se interpreta la instrucción OrderBy(tb=>tb.TabIndex))?

    Me refiero básicamente a: de dónde sale tb y qué tipo de operador es =>

    Gracias


    Skar.2007

    viernes, 29 de noviembre de 2013 8:08
  • Hola Skar,

    Eso son Expresiones Lambda y sirven para recorrer una colección ejecutando ciertas acciones. A ver si me explico mejor con un ejemplo:

    // tenemos una lista de enteros
    List<int> lista = ...
    
    IEnumerable<int> seleccionada = lista.Where((entero) => entero == 3);

    En este ejemplo tenemos una lista de enteros, y lo que hacemos es seleccionar los que son igual a 3, almacenandolos en un IEnumerable, que es el tipo que devuelven estos metodos (aunque tambien existen funciones que convierten a otros tipos, como es ToList, que retorna una lista). Como podrás observar, "entero" es una variable que se crea dentro del predicado para comprobar su valor. Tienes que ver que esto es como un bucle, o un recorrido por una colección, donde "entero" es el elemento de la iteracion actual. En mi ejemplo yo te he puesto la función Where, que extrae todos los elementos que cumplen una condición, pero hay muchas más. Y ten en cuenta, que siempre que puedas utilizar LINQ para recorrer colecciones, debes hacerlo, ya que es mucho más eficiente que los bucles convencionales.

    En el caso de lo que te ha puesto Leandro, lo que hace es obtener todos los controles de tipo TextBox ordenados por su TabIndex, ya que tb es el textbox de cada iteracion, por decirlo de alguna manera.

    Espero haberme explicado bien y haberte ayudado, salu2!


    Jose Alberto Marti


    viernes, 29 de noviembre de 2013 10:14
  • ¿Por qué al utilizar el For Each para recorrer los Controles mencionados se devuelven en orden inverso?

    en realidad tiene que ver por como fueran cargados en la coleccion cuando se inicia el form

    si agregas a la coleccion usando el Add() de atras hacia delante, cuando recuperes esa lista lo haras de esa misma forma como fueron asignado a la coleccion


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    viernes, 29 de noviembre de 2013 10:24
  • Hola Leandro, gracias por comentario. Mi problema no era el que plantea Skar.2007 sino que yo recorria todos los ontroles del winform, pero solo necesitaba recorrer un tipo especifico y el compilador me devolvia un error al detectar un control distinto del que yo necesitaba, pero con Controls.OfType<Object>() lo solucione.

    Gracias.


    sábado, 17 de octubre de 2015 21:08