none
Criterio de orden ne For Each RRS feed

  • Pregunta

  • Necesito saber que criterio de orden usa un For Each cuando apunta a un objeto.

    Tengo una Sub con el siguiente codigo

      For Each TB In Me.Controls
                If TypeOf (TB) Is TextBox Then
                    TB.TEXT = FIBITOS(N)
                    N = N + 1
                End If

    en donde FIBITOS(N) es una matriz de enteros.

    El código va llenado 10 text box y comienza con el último en ser diseñado (allí pone FIBITOS(0))  continua ordenadamente hasta llegar al primer texbox diseñado donde coloca a FIBITOS(9).

    pensé que modificando el TabIndex podría cambiarlo, pero no resultó. 

    ¿Esto siempre es así? ¿se puede modificar?¿es consistente?¿que pasaría si en este Form necesito agregar otro texbox?

    gracias


    Pedro López

    jueves, 4 de junio de 2015 0:43

Respuestas

  • hola

    >>Necesito saber que criterio de orden usa un For Each cuando apunta a un objeto.

    no usa ningun criterio, lo ardena como estaba o aparece en la lista original que recorre

    >>El código va llenado 10 text box y comienza con el último en ser diseñado (allí pone FIBITOS(0))  continua ordenadamente hasta llegar al primer texbox diseñado donde coloca a FIBITOS(9).

    o sea cada posicion del array mapea el index con un nombre del textbox ?

    podrias usar

    Dim ctrls As List(Of TextBox) = Me.Controls.OfType(Of TextBox).OrderBy(Function(x) x.TabIndex).ToList(); 
    
    For Each TB As TextBox In ctrls
    	TB.TEXT = FIBITOS(N)
    	N = N + 1
    Next

    con linq todo es mas simple

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pearloga jueves, 4 de junio de 2015 10:14
    jueves, 4 de junio de 2015 3:27
  • Necesito saber que criterio de orden usa un For Each cuando apunta a un objeto.

    El criterio no lo decide el For Each, lo decide el objeto.

    Al compilar el For Each, se traduce en una serie de llamadas al método Next del IEnumerator implementado en el objeto. Ese método Next (que forma parte del objeto) es el que decide cuál es el siguiente valor que devuelve en cada momento, y por tanto el que establece el orden del ForEach.

    En el caso específico de la colección Controls, el orden en el que su método Next devuelve los objetos es el mismo orden en que se introdujeron en la colección. Y el orden en el que se introdujeron es el mismo orden en que los fuiste añadiendo a la pantalla, que queda salvado dentro del método InitializeComponent invocado desde el New del formulario. Puedes editar a mano el InitializeComponent y reordenar el contenido, o bien si ya tienes una propiedad que establece el orden (tal como el TabIndex), hacer un "OrderBy" de la colección en función de dicho valor, como ya te han sugerido en otra respuesta.

    • Marcado como respuesta Pearloga jueves, 4 de junio de 2015 10:15
    jueves, 4 de junio de 2015 9:45
  • HABER.. no se si alguien lo dijo mas adelante pero igual voy a explicar..

     form.designer es donde se diseñan los objetos (como todos saben) dentro de este aunque nosotros vemos y dibujamos gráficos visua basic genera el código que es asi mas o menos


            Me.TextBox1 = New System.Windows.Forms.TextBox()
            Me.TextBox2 = New System.Windows.Forms.TextBox()
            Me.TextBox3 = New System.Windows.Forms.TextBox()

    ese mismo orden va a apliar el metodo for each al momento de recorrer los textbox;

    asi que tienes que buscar otras opciones como aplicar el numerosegun el nombre del textbox o creando tu mismo los textbox mediante codigo

    por cierto se me olvidó la matriz Pobitho() que utilizas para colocar los valores; deberías de revisarla para saber como estan los datos dentro de ella; porque lo que tu me dices es que el suceso es al revés o revisa el form1.designer

    jueves, 4 de junio de 2015 17:17

Todas las respuestas

  • hola

    >>Necesito saber que criterio de orden usa un For Each cuando apunta a un objeto.

    no usa ningun criterio, lo ardena como estaba o aparece en la lista original que recorre

    >>El código va llenado 10 text box y comienza con el último en ser diseñado (allí pone FIBITOS(0))  continua ordenadamente hasta llegar al primer texbox diseñado donde coloca a FIBITOS(9).

    o sea cada posicion del array mapea el index con un nombre del textbox ?

    podrias usar

    Dim ctrls As List(Of TextBox) = Me.Controls.OfType(Of TextBox).OrderBy(Function(x) x.TabIndex).ToList(); 
    
    For Each TB As TextBox In ctrls
    	TB.TEXT = FIBITOS(N)
    	N = N + 1
    Next

    con linq todo es mas simple

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Pearloga jueves, 4 de junio de 2015 10:14
    jueves, 4 de junio de 2015 3:27
  • Necesito saber que criterio de orden usa un For Each cuando apunta a un objeto.

    El criterio no lo decide el For Each, lo decide el objeto.

    Al compilar el For Each, se traduce en una serie de llamadas al método Next del IEnumerator implementado en el objeto. Ese método Next (que forma parte del objeto) es el que decide cuál es el siguiente valor que devuelve en cada momento, y por tanto el que establece el orden del ForEach.

    En el caso específico de la colección Controls, el orden en el que su método Next devuelve los objetos es el mismo orden en que se introdujeron en la colección. Y el orden en el que se introdujeron es el mismo orden en que los fuiste añadiendo a la pantalla, que queda salvado dentro del método InitializeComponent invocado desde el New del formulario. Puedes editar a mano el InitializeComponent y reordenar el contenido, o bien si ya tienes una propiedad que establece el orden (tal como el TabIndex), hacer un "OrderBy" de la colección en función de dicho valor, como ya te han sugerido en otra respuesta.

    • Marcado como respuesta Pearloga jueves, 4 de junio de 2015 10:15
    jueves, 4 de junio de 2015 9:45
  • Gracias


    Pedro López

    jueves, 4 de junio de 2015 15:54
  • HABER.. no se si alguien lo dijo mas adelante pero igual voy a explicar..

     form.designer es donde se diseñan los objetos (como todos saben) dentro de este aunque nosotros vemos y dibujamos gráficos visua basic genera el código que es asi mas o menos


            Me.TextBox1 = New System.Windows.Forms.TextBox()
            Me.TextBox2 = New System.Windows.Forms.TextBox()
            Me.TextBox3 = New System.Windows.Forms.TextBox()

    ese mismo orden va a apliar el metodo for each al momento de recorrer los textbox;

    asi que tienes que buscar otras opciones como aplicar el numerosegun el nombre del textbox o creando tu mismo los textbox mediante codigo

    por cierto se me olvidó la matriz Pobitho() que utilizas para colocar los valores; deberías de revisarla para saber como estan los datos dentro de ella; porque lo que tu me dices es que el suceso es al revés o revisa el form1.designer

    jueves, 4 de junio de 2015 17:17