none
como hacer una lista de objetos para diferentes tipos de controles

    Pregunta

  • Dim listaTxt As New List(Of TextBox)
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        listaTxt.AddRange(New TextBox() {TextBox1, TextBox2})  'Agrega los textBox
    
        For Each txt As TextBox In listaTxt
            AddHandler txt.TextChanged, AddressOf hasContent
        Next
    End Sub
    
    Private Sub hasContent(sender As Object, e As EventArgs)
        Button1.Enabled = listaTxt.Any(Function(x) x.Text.Trim().Length <> 0)
    End Sub
    Tengo un formulario que tiene un tabcontrol con cuatro tab en cada uno de esos tab hay diferentes tipos de controles, textbox, combobox, checkbox etc, el codigo que tengo arriba funciona perfecto pero solo coje los textbox y yo quiero que sean diferentes tipos de controles.
    lunes, 21 de noviembre de 2016 15:38

Respuestas

  • Joel gracias por tu valiosa aportacion, de los que son los ctype y los directcast pero no se comp podria poner el codigo, supongamos que tengo dos textbox y un checkbox donde podria poner el codigo

    Hola Efrain Diaz,

    Disculpa, tuve un pequeño desliz al mencionarte el tipo, indudablemente debes usar la lista de tipo Control como lo menciona Sergio. No obstante si tienes diferentes controles ten en cuenta que los eventos que usarás cambiaría, o usarías el evento TextChanged para el CheckBox ? Sería mejor usar el evento CheckedChanged y así con los demás controles.

    Por lo que podrías hacer algo como :

    Dim listaTxt As New List(Of Control)
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        listaTxt.AddRange(New Control() {TextBox1, CheckBox1, TextBox2})
    
        For Each ctrl As Control In listaTxt
            Select Case ctrl.GetType
                Case GetType(TextBox)
                    AddHandler DirectCast(ctrl, TextBox).TextChanged, AddressOf hasContent
                Case GetType(CheckBox)
                    AddHandler DirectCast(ctrl, CheckBox).CheckedChanged, AddressOf cambioContenido
                Case Else
                    'Es otro tipo...
            End Select
        Next
    End Sub

    Y crea los método que trabajarán para cada tipo :

        Private Sub cambioContenido(sender As Object, e As EventArgs)
            'Hacer algo para los CheckBox
        End Sub
    
        Private Sub hasContent(sender As Object, e As EventArgs)
            'Hacer algo para los TextBox
        End Sub

    O es que usarás el mismo evento para todos los controles ?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Efrain Diaz lunes, 21 de noviembre de 2016 17:42
    lunes, 21 de noviembre de 2016 17:40

Todas las respuestas

  • Hola Efrain Diaz,

    Tendrías que crear la lista de tipo Object.

     Dim lista As New List(Of Object)

    Y cuando vas a utilizar el elemento tienes que castear al tipo usando CType, DirectCast o TryCast para que puedas usar sus propiedades.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 21 de noviembre de 2016 15:47
  • Hola. Tendrás que definir tu lista como una List(Of Control) todo control hereda de la clase Control.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 21 de noviembre de 2016 17:16
  • Joel gracias por tu valiosa aportacion, de los que son los ctype y los directcast pero no se comp podria poner el codigo, supongamos que tengo dos textbox y un checkbox donde podria poner el codigo
    lunes, 21 de noviembre de 2016 17:18
  • mira el ejemplo que puse y supongamos que tengo dos textbox y un checkbox como lo harias
    lunes, 21 de noviembre de 2016 17:24
  • Hola. Como cargas la lista de Controles?. Si te fijas en la clase Control, ésta tiene como propiedad Text. PD: Estoy suponiendo estas trabajando en Windows Forms.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    lunes, 21 de noviembre de 2016 17:26
  • Joel gracias por tu valiosa aportacion, de los que son los ctype y los directcast pero no se comp podria poner el codigo, supongamos que tengo dos textbox y un checkbox donde podria poner el codigo

    Hola Efrain Diaz,

    Disculpa, tuve un pequeño desliz al mencionarte el tipo, indudablemente debes usar la lista de tipo Control como lo menciona Sergio. No obstante si tienes diferentes controles ten en cuenta que los eventos que usarás cambiaría, o usarías el evento TextChanged para el CheckBox ? Sería mejor usar el evento CheckedChanged y así con los demás controles.

    Por lo que podrías hacer algo como :

    Dim listaTxt As New List(Of Control)
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        listaTxt.AddRange(New Control() {TextBox1, CheckBox1, TextBox2})
    
        For Each ctrl As Control In listaTxt
            Select Case ctrl.GetType
                Case GetType(TextBox)
                    AddHandler DirectCast(ctrl, TextBox).TextChanged, AddressOf hasContent
                Case GetType(CheckBox)
                    AddHandler DirectCast(ctrl, CheckBox).CheckedChanged, AddressOf cambioContenido
                Case Else
                    'Es otro tipo...
            End Select
        Next
    End Sub

    Y crea los método que trabajarán para cada tipo :

        Private Sub cambioContenido(sender As Object, e As EventArgs)
            'Hacer algo para los CheckBox
        End Sub
    
        Private Sub hasContent(sender As Object, e As EventArgs)
            'Hacer algo para los TextBox
        End Sub

    O es que usarás el mismo evento para todos los controles ?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Efrain Diaz lunes, 21 de noviembre de 2016 17:42
    lunes, 21 de noviembre de 2016 17:40