none
Leer información de varios ComboBox con arreglos. RRS feed

  • Pregunta

  • Hola a todos! Desde ya, ¡Gracias por interesarse en tratar de brindarme un poco de consejo/ayuda!

    La duda presente que tengo es:

    En un determinado formulario, tengo 4 ComboBox en los cuáles en cada uno de ellos hay una colección de elementos.

    Y lo que necesito hacer es, recorrerlos, hacer la combinación entre todos y que salga en un determinado caso.

    Están presentes, el código del button "Autodetectar" en la cuál se realizan los statements y se evalúa una función "correcto" y además, la función misma, que es Booleana y tiene que recibir parámetros en forma de Strings a la hora de compararlas!

    Creo que mi error está, en que a la hora de invocar la función, los parámetros no están en forma de String, por lo tanto, considero que no estoy accediendo a la información de cada elemento de c/ arreglo.

    Mi pregunta es: ¿Pueden reconocer cuál/es son los errores que estoy cometiendo? ¿Me estoy olvidando de algo?

    ¿Cómo lo resolverían? y por último ¿De qué otra forma volverían a hacer ésto?

    Les dejo el código de ésta parte:

    _____________________________________

    Imports System.IO.Ports

    Public Class Balanza


        Function correcto(ByVal Puerto As String, ByVal Baudios As String, ByVal Bits As String, ByVal Paridad As String) As Boolean
            If (Puerto = "COM1") And (Baudios = "110") And (Bits = "7") And (Paridad = "Odd") Then
                MsgBox("La combinación es correcta")
                Return True
            Else
                MsgBox("La combinación es incorrecta")
                Return False
            End If
        End Function


        Private Sub btnAutoDetect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAutoDetect.Click

            For i = 0 To cboPort.Items.Count - 1
                cboPort.SelectedIndex = i

                For j = 0 To cBoBaudios.Items.Count - 1
                    cBoBaudios.SelectedIndex = j

                    For k = 0 To cboBits.Items.Count - 1
                        cboBits.SelectedIndex = k

                        For l = 0 To cboParidad.Items.Count - 1
                            cboParidad.SelectedIndex = l

                            If correcto(cboPort.SelectedItem.ToString(i), cBoBaudios.SelectedItem.ToString(j), cboBits.SelectedItem.ToString(k), cboParidad.SelectedItem.ToString(l)) Then
                                Exit Sub
                            End If

                        Next
                    Next
                Next
            Next
        End Sub
    End Class

    _______________________________________________________________

    A la hora de invocar a correcto, ¿Qué utilizo para LEER la información de cada elemento?:

    -SelectedItem.ToString(var)

    -GetItemText(var)

    -var.ToString

    -Otros

    Desde ya, muchísimas Gracias!

    viernes, 13 de diciembre de 2013 15:09

Respuestas

  • "Ocs Legna" escribió:

    > Creo que mi error está, en que a la hora de invocar la función, los parámetros
    > no están en forma de String, por lo tanto, considero que no estoy accediendo
    > a la información de cada elemento de c/ arreglo.

    Hola:

    La información sí está en formato String, porque así es como están definidos los cuatros parámetros de la función llamada Correcto. Pero ¡claro! Al hacer comparaciones con valores alfanuméricos, tienes que tener presente la combinación de mayúsculas/minúsculas, ya que el resultado será False si no coinciden los caracteres, aunque tengan el mismo valor.

    Yo probaría a dejar la función Correcto como indico a continuación:

        Friend Function Correcto(ByVal puerto As String, ByVal baudios As Integer, _
                                 ByVal bits As Integer, ByVal paridad As String) As Boolean
    
            If ((puerto.Equals("COM1", StringComparison.CurrentCultureIgnoreCase)) AndAlso _
                (baudios = 110) AndAlso (bits = 7) AndAlso _
                paridad.Equals("Odd", StringComparison.CurrentCultureIgnoreCase)) Then
    
                MessageBox.Show("La combinación es correcta.")
                Return True
            End If
    
            MessageBox.Show("La combinación es incorrecta.")
            Return False
    
        End Function

    Fíjate que los parámetros baudios y bits los he definido con el tipo de dato Integer, lo que quiere decir que los elementos de los controles ComboBox llamados cboBaudios y cboBits se tienen que poder convertir a Integer, porque de no ser así, vas a obtener la oportuna excepción a la hora de convertir los datos.

    Asimismo utilizo el operador AndAlso para abandonar la comprobación de los valores si alguno de ellos no cumple con la condición indicada. Con el operador And se tienen que efectuar todas las comprobaciones, aunque las primeras no cumplan con la condición.

    > A la hora de invocar a correcto, ¿Qué utilizo para LEER la información de cada elemento?:

    Si los elementos de los cuatro controles ComboBox no están enlazados a ningún origen de datos, entiendo que lo correcto sería que leyeras el valor actual de su propiedad Items, porque si vas cambiando el valor de su propiedad SelectedIndex, esto hará que los distintos valores se vayan mostrando en sus respectivos controles ComboBox:

        Private Sub btnAutoDetect_Click( _
            ByVal sender As Object, ByVal e As EventArgs) Handles btnAutoDetect.Click
    
            For i = 0 To cboPort.Items.Count - 1
                For j = 0 To cboBaudios.Items.Count - 1
                    For k = 0 To cboBits.Items.Count - 1
                        For l = 0 To cboParidad.Items.Count - 1
    
                            Dim port As String = CStr(cboPort.Items(i))
                            Dim baudios As Integer = CInt(cboBaudios.Items(j))
                            Dim bits As Integer = CInt(cboBits.Items(k))
                            Dim paridad As String = CStr(cboParidad.Items(l))
    
                            If (Correcto(port, baudios, bits, paridad)) Then
                                Return
                            End If
    
                        Next l
                    Next k
                Next j
            Next i
    
        End Sub

    Insisto en que doy por hecho que los valores de los controles cboBaudios y cboBits se pueden convertir a Integer.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    domingo, 15 de diciembre de 2013 10:57
    Moderador
  • Hola Enrique

    Mi código(el If statement final) al final quedó de la siguiente forma:

    If correcto(cboPort.SelectedItem.ToString, cBoBaudios.SelectedItem.ToString, cboBits.SelectedItem.ToString, cboParidad.SelectedItem.ToString) Then
                                Exit Sub

    De ésta manera al inicializar el programa y hacer click en autodetectar, va cambiando en uno los valores en cada uno de los arreglos. Y además, me permite dejar a las variables en formato String.

    De todas maneras, su consejo fue muy útil y pude reproducir los mismos resultados.

    Desde ya, muchas gracias.

    lunes, 16 de diciembre de 2013 13:20

Todas las respuestas

  • "Ocs Legna" escribió:

    > Creo que mi error está, en que a la hora de invocar la función, los parámetros
    > no están en forma de String, por lo tanto, considero que no estoy accediendo
    > a la información de cada elemento de c/ arreglo.

    Hola:

    La información sí está en formato String, porque así es como están definidos los cuatros parámetros de la función llamada Correcto. Pero ¡claro! Al hacer comparaciones con valores alfanuméricos, tienes que tener presente la combinación de mayúsculas/minúsculas, ya que el resultado será False si no coinciden los caracteres, aunque tengan el mismo valor.

    Yo probaría a dejar la función Correcto como indico a continuación:

        Friend Function Correcto(ByVal puerto As String, ByVal baudios As Integer, _
                                 ByVal bits As Integer, ByVal paridad As String) As Boolean
    
            If ((puerto.Equals("COM1", StringComparison.CurrentCultureIgnoreCase)) AndAlso _
                (baudios = 110) AndAlso (bits = 7) AndAlso _
                paridad.Equals("Odd", StringComparison.CurrentCultureIgnoreCase)) Then
    
                MessageBox.Show("La combinación es correcta.")
                Return True
            End If
    
            MessageBox.Show("La combinación es incorrecta.")
            Return False
    
        End Function

    Fíjate que los parámetros baudios y bits los he definido con el tipo de dato Integer, lo que quiere decir que los elementos de los controles ComboBox llamados cboBaudios y cboBits se tienen que poder convertir a Integer, porque de no ser así, vas a obtener la oportuna excepción a la hora de convertir los datos.

    Asimismo utilizo el operador AndAlso para abandonar la comprobación de los valores si alguno de ellos no cumple con la condición indicada. Con el operador And se tienen que efectuar todas las comprobaciones, aunque las primeras no cumplan con la condición.

    > A la hora de invocar a correcto, ¿Qué utilizo para LEER la información de cada elemento?:

    Si los elementos de los cuatro controles ComboBox no están enlazados a ningún origen de datos, entiendo que lo correcto sería que leyeras el valor actual de su propiedad Items, porque si vas cambiando el valor de su propiedad SelectedIndex, esto hará que los distintos valores se vayan mostrando en sus respectivos controles ComboBox:

        Private Sub btnAutoDetect_Click( _
            ByVal sender As Object, ByVal e As EventArgs) Handles btnAutoDetect.Click
    
            For i = 0 To cboPort.Items.Count - 1
                For j = 0 To cboBaudios.Items.Count - 1
                    For k = 0 To cboBits.Items.Count - 1
                        For l = 0 To cboParidad.Items.Count - 1
    
                            Dim port As String = CStr(cboPort.Items(i))
                            Dim baudios As Integer = CInt(cboBaudios.Items(j))
                            Dim bits As Integer = CInt(cboBits.Items(k))
                            Dim paridad As String = CStr(cboParidad.Items(l))
    
                            If (Correcto(port, baudios, bits, paridad)) Then
                                Return
                            End If
    
                        Next l
                    Next k
                Next j
            Next i
    
        End Sub

    Insisto en que doy por hecho que los valores de los controles cboBaudios y cboBits se pueden convertir a Integer.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    domingo, 15 de diciembre de 2013 10:57
    Moderador
  • Hola Enrique

    Mi código(el If statement final) al final quedó de la siguiente forma:

    If correcto(cboPort.SelectedItem.ToString, cBoBaudios.SelectedItem.ToString, cboBits.SelectedItem.ToString, cboParidad.SelectedItem.ToString) Then
                                Exit Sub

    De ésta manera al inicializar el programa y hacer click en autodetectar, va cambiando en uno los valores en cada uno de los arreglos. Y además, me permite dejar a las variables en formato String.

    De todas maneras, su consejo fue muy útil y pude reproducir los mismos resultados.

    Desde ya, muchas gracias.

    lunes, 16 de diciembre de 2013 13:20