none
While click botones

    Pregunta

  • Hola, quisiera saber si esto es posible. Voy poniendo el código que tengo para que se entienda:

    Private Sub FormN1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim ConsVali = "SELECT Id, Espacio, SUBSTRING(Espacio, 1, 1) AS Lado, SUBSTRING(Espacio, 2, 1) AS Bloque, SUBSTRING(Espacio, 3, 1) AS Piso, SUBSTRING(Espacio, 4, 2) AS Tipo, SUBSTRING(Espacio, 6, 2) AS Nro, Disponible FROM UbicaN WHERE SUBSTRING(Espacio, 2, 1) = '" + FormValida.Ubica1.Text + "'"
            Dim i = 0
            Try
                Conecta()
                Dim MysqlDadap2 As New MySqlDataAdapter(ConsVali, _conecta)
                Dim tb2 As New DataTable
                MysqlDadap2.Fill(tb2)
                Dim a = tb2.Rows.Count
                ' MsgBox(a)
                While i <= a
                    Dim row As DataRow = tb2.Rows(i)
                    i += 1
                    Dim Espacio = row("Espacio")
                    Dim Lado = row("Lado")
                    Dim Bloque = row("Bloque")
                    Dim Piso = row("Piso")
                    Dim Tipo = row("Tipo")
                    Dim Nro = row("Nro")
                    Dim disp = row("Disponible")
                    Dim Boton = Me.Controls.OfType(Of Button).FirstOrDefault(Function(c) c.Name = String.Concat(Espacio, Lado, Bloque, Piso, Tipo, Nro))
                    Dim id_ = row("Id")
                    If disp = "0" Then
                        Boton.BackColor = Color.LightGray
                    Else
                        Boton.BackColor = Color.Tomato
                        Boton.Enabled = False
                    End If
                    
                End While
     

    Hasta ahí me pinta y des-habilita los botones que no están disponibles (según la consulta).

    Lo que me gustaría saber es si puedo meter dentro del while un evento click para cada uno de los botones que si estén habilitados y darle valores el evento: Ejemplo: 

    Form.Ubica2.Text = Lado
    Form.Ubica3.Text = Piso
    Form.UbicaNro.Text = Nro
    Me.WindowState = FormWindowState.Minimized
    A10NI01.BackColor = Color.Orange

    Para no tener que escribir evento por evento de los 200 botones que tengo en el form.

    Desde ya muchísimas gracias.

     


    martes, 21 de febrero de 2017 17:31

Respuestas

  • RobertoCAarrillo,

    Antes que rellenar un objeto de tipo DataTable bastaba con recuperar fila a fila -los resultados- mediante la clase MySqlDataAdapter, tenlo en cuenta.

    Al caso, puedes contener los valores de las variables Lado, Piso y Nro en la propiedad Tag de cada botón y tomarlos cuando se haga clic sobre "x" botón:

    '...
    Dim Boton = Me.Controls.OfType(Of Button).FirstOrDefault(...)
    
    Boton.Tag = String.Format("{0}-{1}-{2}", Lado, Piso, Nro)
    
    'Vincular el evento clic a un único manejador de eventos
    AddHandler Boton.Click, AddressOf Boton_Click
    
    '...

    - Manejador del evento clic

    Private Sub Boton_Click(sender As Object, e As EventArgs)
    
    	Dim btn = DirectCast(sender, Button)
    
    	Dim Partes As String() = btn.Tag.ToString().Split(New Char() {"-"c})
    
    	Form.Ubica2.Text = Partes(0) 'Lado
    	Form.Ubica3.Text = Partes(1) 'Piso
    	Form.UbicaNro.Text = Partes(2) 'Nro
    	Me.WindowState = FormWindowState.Minimized
    	A10NI01.BackColor = Color.Orange
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 21 de febrero de 2017 17:58

Todas las respuestas

  • RobertoCAarrillo,

    Antes que rellenar un objeto de tipo DataTable bastaba con recuperar fila a fila -los resultados- mediante la clase MySqlDataAdapter, tenlo en cuenta.

    Al caso, puedes contener los valores de las variables Lado, Piso y Nro en la propiedad Tag de cada botón y tomarlos cuando se haga clic sobre "x" botón:

    '...
    Dim Boton = Me.Controls.OfType(Of Button).FirstOrDefault(...)
    
    Boton.Tag = String.Format("{0}-{1}-{2}", Lado, Piso, Nro)
    
    'Vincular el evento clic a un único manejador de eventos
    AddHandler Boton.Click, AddressOf Boton_Click
    
    '...

    - Manejador del evento clic

    Private Sub Boton_Click(sender As Object, e As EventArgs)
    
    	Dim btn = DirectCast(sender, Button)
    
    	Dim Partes As String() = btn.Tag.ToString().Split(New Char() {"-"c})
    
    	Form.Ubica2.Text = Partes(0) 'Lado
    	Form.Ubica3.Text = Partes(1) 'Piso
    	Form.UbicaNro.Text = Partes(2) 'Nro
    	Me.WindowState = FormWindowState.Minimized
    	A10NI01.BackColor = Color.Orange
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 21 de febrero de 2017 17:58
  • Excelente, clarísimo. Funciona. Es grandioso que gente como vos se preocupe por la necesidades de gente como yo, jajajaja. De verdad, me ahorraste horas y horas de escritura. Muchísimas gracias.

    Y voy a tener en cuenta...

    " Antes que rellenar un objeto de tipo DataTable bastaba con recuperar fila a fila -los resultados- mediante la clase MySqlDataAdapter, " 

    y Solamente lo hago porque de memoria aprendí a llenar tablas y nunca la pegué en como utilizar esta clase. Pero me voy a poner y lo voy a hacer de ese modo. Supongo que s por una cuestión de recursos.

    Gracias x 2 

     
    martes, 21 de febrero de 2017 18:34