Como saber en que botón estoy posicionado

Tengo una función llamada AgregarBoton; donde crea un botón en tiempo de ejecución y lo agrega a un FlowLayoutPanel, que esta asociando al procedimiento "EventoClick" al evento Click del botón.
Y cuando se realiza click en cualquier botón del FlowLayoutPanel, ejecuta el procedimiento "Evento Click".
Pero no se como puedo a través del procedimiento "Evento Click", conocer en que botón se realizo el click, es decir obtener el nombre del Botón para aplicarle a cada botón un tratamiento especial...
Public Function AgregarBoton(ByRef FlowPrincipal As FlowLayoutPanel) As Boolean
Dim Boton As New Button
AddHandler Boton.Click, AddressOf EventoClick
FlowPrincipal.Controls.Add(Boton)
Return True
End Function
_
Public Sub EventoClick()
Msgbox("hola")
End Sub
YO creo que me falta algún parámetro, que me permita consultar en que botón estoy posicionado.
Y ademas como puede obtener la posición del botón dentro del flayauFlowLayoutPanel, es decir si se encuentra en primer lugar, segundo, ultimo... Etc.
Espero que me ayuden, no he podido encontrar la solución...

6 Respuestas

Respuesta
1
¿Qué tal si antes de agregar el control al LayoutPanel guardas la referencia a ese objecto en un array? Puedes ponerle por ejemplo de 50 elementos aunque no los uses todos o si quieres ser exacto puedes usar una lista enlazada. Aunque la verdad yo lo haría con un array, es más rapido y si quieres insertar por ejemplo uno al principio, solo corres los demás elementos una ubicación, borras los controles del panel y luego con un for los vuelves a insertar desde el array
ahora para esto de saber cual botón presionaste yo lo que haría seria una nueva clase que herede de la clase button, por ejemplo seria la clase ButtonX y agregarle a esa clase los métodos que necesites identificados con un correlativo (1,2,3,4) de modo que sirva de indice y luego añadirle una propiedad a la clase, por ejemplo la propiedes "metod" como entero. Luego al panel ya no ayades objetos de tipo Button sino añades objetos de tipo ButtonX de modo que antes de insertarlos al panel y al array establezcas el valor para la propiedad "method" que sera lo que se ejecute cuando le hagas click.
Ojo que tienes que en la clase ButtonX tienes que indicar que lo que se ejecutara estará en función del valor de la propiedad method. Podría ser un select case, si es 1 muestra un mensaje, si es dos cierra el formulario, si es 3 realiza una suma etc.
Encontré la solución... agregre a EventoClick esto:
Public Sub EventoDobleClick(ByVal sender As Object, ByVal e As EventArgs)
Dim myButton As Button = sender
msgbox(Mybutton.name)
End Sub
Ahora puedo modificar cada botón a través de Mybutton...
Respuesta
2
En mi opinión, lo que tienes que hacer es castear la variable sender que se suele enviar para los eventos click para comprobar que botón es el que pulsó.
En la firma de la función pondría
Public Function AgregarBoton(ByRef FlowPrincipal As FlowLayoutPanel, object sender) As Boolean
...
(Y comprobarlo de esta manera)
if (sender is Button)
{
     messagebox.show ((Button)sender).Name;
}
Encontré la solución... agregre a EventoClick esto:
Public Sub EventoDobleClick(ByVal sender As Object, ByVal e As EventArgs)
Dim myButton As Button = sender
msgbox(Mybutton.name)
End Sub
Ahora puedo modificar cada botón a través de Mybutton...
Gracias a tu respuestas se me ocurrió como solucionarlo...
Respuesta
1
Coloca un parámetro en el evento, este parámetro de tipo object y envías el botón como tal, o copia la firma de un evento click de un botón normal
El problema es que AddressOf no acepta el parámetros...
AddHandler Boton.Click, AddressOf EventoClick (No acepta parametros)
_
Public Sub EventoClick()
Msgbox("hola")
End Sub
Si lo único que quiero que a través del "EventoClick", conozca en que botón realize click.
Ojala que me ayudes... gracias..
Claro!
Porque el procedimiento que ejecuta el delegado no lo has definido con parámetros:
Public Sub EventoClick(byval sender as object)
Msgbox("hola")
End Sub
Gracias, solucione el problema, agregando lo siguiente:
_
Public Sub EventoClick(ByVal sender As Object, ByVal e As EventArgs)
Dim myButton As Button = sender
End Sub
Con myButton puedo acceder al botón especifico y modificar..
Saludos...
Respuesta
1
en c# .net
la funcion del evento click recibe 2 parametros:
protected void Bt_Music_Click(object sender, ClickEventArgs e)
El sender es donde se hace click, y EventArg es como se hace (botón del ratón, combinación con teclado...)
haciendo:
Button quien = (Button)sender;
if (quien.Text == "texto_boton")
{
......
}
Respuesta
1
Los botones son como una clases de botones
Mismo nombre pero distinto indice ¿?
Entonces cuando haces click, el botón debe tener asignado un numero de control
Y ese es el que tienes que obtener
Pero mi problemas es como obtener ese indice... no se me ocurre...
Disculpa la demora, yo uso algo parecido pero con checkbox
Tomo el dato que se encuentra en un Groupbox
Y ahí es el mismo nombre pero con su indice
Para llenar el group box
For Each Ctl As ComboBox In Me.PanelGrupos.Controls
A = A + 1
UnGrupo = AllCursos.MuestraCursos_x_Grupo("1111", A)
For B = 0 To UnGrupo.Count - 1
Ctl.Visible = True
Ctl.Items.Add(UnGrupo.Item(B).Curso)
Next
y para tomar datos
For Each Ctl As CheckBox In GB2.Controls
         UnConcepto.adt = Ctl.Text 'en mi caso tomo el nombre escrito en el checkbox.
Averigua un poco más profundo el uso de GroupBox
Respuesta
1
Insertá un modulo y declará una variable global, y al principio del procedimiento click de cada botón ponele algo que lo identifique, si presionas el botón agregar usuario que la variable global te guarde el 1 por ejemplo, entonces para validarlo utilizas un case o if para darle la atención especial que tu dices.
Gracias... pero encontré una solución... agregando lo siguiente...
Public Sub EventoClick(ByVal sender As Object, ByVal e As EventArgs)
Dim myButton As Button = sender
End Sub
Con myButton puedo acceder al botón especifico y modificar..
Saludos...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas