elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  (solucionado) ¿clonar evento para varios elementos? ¿FOR?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 5 6 Ir Abajo Respuesta Imprimir
Autor Tema: (solucionado) ¿clonar evento para varios elementos? ¿FOR?  (Leído 18,414 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
(solucionado) ¿clonar evento para varios elementos? ¿FOR?
« en: 18 Noviembre 2012, 12:39 pm »

Hola,

Tengo un panel con casi 50 checkboxes (todos siguen un orden de nombre bien enumerado), y por ejemplo este es el sub del chekbox1:

Código
  1.    Public Sub C1CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles C1CheckBox1.CheckedChanged
  2.        If C1CheckBox1.Checked = True Then My.Settings.box1_selected = "Y" Else My.Settings.box1_selected = "N"
  3.        Dim checkedpath1 = C1CheckBox1.Text
  4.    End Sub

Lo que quisiera poder hacer es que ese mismo evento afecte a todos los checkboxes, eso se que se puede hacer añadiendo los checkboxes al "handle", vale, pero no es suficiente, ya que lo que hay dentro del sub del ejemplo solo afectará al checkbox 1 aunque yo añada todos al handle, ¿entienden lo que quiero decir?

Hay alguna forma de no escribir el mismo evento para los 50 checkboxes?

es decir, yo necesito hacer esto:

(Pseudocode)

Public Sub TODOS_LOS_CHECKBOXES_CheckedChanged(sender As Object, e As EventArgs) Handles TODOS_LOS_CHECKBOXES.CheckedChanged
If CUALQUIER_CHECKBOX.Checked = True Then My.Settings.NÚMERO_DEL_CHECKBOX_SELECCIONADO_selected = "Y" Else My.Settings.boxNÚMERO_DEL_CHECKBOX_SELECCIONADO_selected = "N"
Dim checkedpathNÚMERO_DEL_CHECKBOX _SELECCIONADO = C1CheckBoxNÚMERO_DEL_CHECKBOX _SELECCIONADO.Text
End Sub


Gracias y un saludo...


« Última modificación: 22 Noviembre 2012, 08:53 am por EleKtro H@cker » En línea


Danyfirex


Desconectado Desconectado

Mensajes: 493


My Dear Mizuho


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #1 en: 18 Noviembre 2012, 13:49 pm »

Si pones tus checkboxs en un groupbox puedes hacer esto.

Código
  1. Dim ChkBox As CheckBox = Nothing
  2.  
  3.        For Each xObject As Object In Me.GroupBox1.Controls
  4.            If TypeOf xObject Is CheckBox Then
  5.                ChkBox = xObject
  6.                ChkBox.Checked = True
  7.            End If
  8.        Next


creo que a eso te refieres.

y sin Groupbox así:

Código
  1. For Each ctrl As Control In Me.Controls
  2.  
  3.            If TypeOf ctrl Is CheckBox Then
  4.                DirectCast(ctrl, CheckBox).CheckState = CheckState.Checked
  5.            End If
  6.  
  7.        Next

saludos.


« Última modificación: 18 Noviembre 2012, 13:52 pm por Danyfirex » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #2 en: 18 Noviembre 2012, 17:33 pm »

Hola,

Gracias, pero lo he probado sin groupbox y no sé como hacerlo funcionar, directamente no ocurre nada... (no me da error)

Código
  1.      For Each ctrl As Control In Me.Controls
  2.            If TypeOf ctrl Is CheckBox Then
  3.                DirectCast(ctrl, CheckBox).Text = "Test"
  4.            End If
  5.        Next

EDITO: Aún así, ese código tendría que usarlo en algun evento... y yo lo que necesito es un evento que haga eso para todos los checkboxes... así que en que evento lo meto? xD

que hago mal?
« Última modificación: 18 Noviembre 2012, 17:37 pm por EleKtro H@cker » En línea


kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.442


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #3 en: 18 Noviembre 2012, 20:41 pm »

Lo que buscas es que todos los CheckBox al ser clickados llamen a un mismo método. Con el "Handles" logras que las acciones de el método trabajen con el objeto que va con el "Handles", no con todos los objetos del mismo tipo.

Este ejemplo crea 3 CheckBox dinámicamente y los agrega al Formulario, sin haberlos dibujado con el IDE del Visual Basic. Después asocio a cada evento CheckedChange del Checkbox con la funcion "LlamadaCheckBox", donde se ejecutarán las instrucciones que desees. Es decir, todos los eventos CheckedChanged de tus CheckBox se asociarán a dicho método, y al producirse tal evento pues se llamará a dicha función.

Código
  1. Public Class Form1
  2.  
  3. ' Esta es la función que se llamará al producirse el evento CheckedChange del CheckBox
  4.    Private Sub LlamadaCheckBox(ByVal sender As Object, ByVal e As System.EventArgs)
  5.        Dim CheckboxN As CheckBox = CType(sender, CheckBox) 'a partir del sender creo el CheckBox (paso de objet a CheckBox para poder utilizar sus propiedades)
  6.        msgbox("Me pinchaste, la cagaste xD")
  7.    End Sub
  8.  
  9.    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  10.        Dim mCheck(2) As CheckBox 'matriz que contendrá los 3 CheckBox
  11.        For i As Int32 = 0 To mCheck.Length - 1
  12.            mCheck(i) = New CheckBox() 'creo un CheckBox en cada espacio de la matriz
  13.            With mCheck(i)
  14.                .Text = "Checkbox" & i + 1 ' Le adjunto un nombre Checkbox1 / Checkbox2 y 3
  15.                .Location = New Point(20, i * 30) ' Sin más los situo....
  16.            End With
  17.            AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox'Asocio el evento CheckedChange del CheckBox actual a la función LlamadaCheckBox
  18.            Me.Controls.Add(mCheck(i)) 'Añado el control al formulario, es decir, lo dibujo
  19.        Next
  20.    End Sub
  21. End Class
  22.  

Espero haberte servido de ayuda!

Saludos!
« Última modificación: 18 Noviembre 2012, 20:58 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

criskapunk

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #4 en: 18 Noviembre 2012, 21:07 pm »

No se si te será de ayuda, pero no se podría crear una matriz de controles en los que por cada elemento (las checkboxes) se vaya realizando la misma rutina?

:http://www.elguille.info/NET/dotnet/arrayControles.htm

Un saludo.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #5 en: 18 Noviembre 2012, 22:38 pm »


Espero haberte servido de ayuda!

Saludos!

Increible, muchísimas gracias Kubox

Mi intención era que al cargar la app saliesen 1 textbox por cada X carpeta previamente bindeada, y he conseguido "dibujar" los textboxs hace unos minutos así:

Código
  1.  Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  2.        playertextbox.Text = My.Settings.playerpath
  3.        foldertextbox.Text = My.Settings.folderpath
  4.        updatefoldernames()
  5.    End Sub
  6.  
  7.    Public Sub updatefoldernames()
  8.        Dim List As Integer = 0
  9.        Dim posy As Integer = 10
  10.  
  11.        filesystem = CreateObject("Scripting.FileSystemObject")
  12.        ThisDir = filesystem.GetFolder(My.Settings.folderpath)
  13.  
  14.        For Each folder In ThisDir.Subfolders
  15.            List = List + 1
  16.            posy = posy + 20
  17.            Dim newCheckBox As New CheckBox()
  18.            Panel1.Controls.Add(newCheckBox)
  19.            newCheckBox.Name = "checkbox" & List.ToString()
  20.            newCheckBox.Text = folder.name
  21.            newCheckBox.Location = New Point(10, posy)
  22.            'MessageBox.Show(newCheckBox.Name.ToString())
  23.  
  24.            Dim checkbox_selected As String = "checkbox" & List.ToString()
  25.            If My.Settings.checkbox_selected = "Y" Then newCheckBox.Checked = True
  26.        Next
  27.    End Sub

Pero me tendría que haber comido la cabeza unas semanas para conseguir lo del evento... ja!, addhandler!, como para saberlo sin haber estudiado 1 año mínimo xD, mil gracias esto me ahorra mucho trabajo ^^

EDITO: Aprovecho para preguntarte Kubox, si puedes fijarte en el final de ese code, intento asociar cada checkbox al nombre de "my.settings"

En my.settings lo tengo así:
My.Settings.checkbox1
My.Settings.checkbox2
My.Settings.checkbox3
etc...
Pero no consigo llamar a ninguno porque solo me acepta un string así que esto me da error:  My.Settings.checkbox_selected

un saludo
« Última modificación: 18 Noviembre 2012, 22:44 pm por EleKtro H@cker » En línea


kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.442


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #6 en: 19 Noviembre 2012, 08:47 am »

Aupa EleKtro H@cker,

buscas cambiar el valor de alguna propiedad guardada en my.settings o simplemente hacer comprobaciones con éstas? Sería mejor que fueras más claro : p

Ahora estoy en clase y no puedo echarle una buena ojeada, más tarde estaré disponible.

Espero tu respuesta,

Saludos!
« Última modificación: 19 Noviembre 2012, 12:33 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #7 en: 19 Noviembre 2012, 14:13 pm »

buscas cambiar el valor de alguna propiedad guardada en my.settings o simplemente hacer comprobaciones con éstas? Sería mejor que fueras más claro : p

Verás, pienso usar el ejemplo que me has proporcionado, eso sin duda, pero esto lo necesito hacer tanto para tu ejemplo como para el mío



En mi ejemplo de arriba, creo nuevos checkboxes y les proporciono un nombre:
Código:
newCheckBox.Name = "checkbox" & List.ToString()

El nombre final de cada checkbox es: "checkbox1", "checkbox2", "checkbox3", etc...

En my-settings los nombres que tengo son:
checkbox1
checkbox2
checkbox3
etc...

(Cada uno con el scope "user", y con el valor de "Y" o "N".)

En resumen, los nombres de los nuevos checkboxes y los nombres de my.settings son exactamente igual, eso lo hice para poder referenciarme mejor a "my.settings" basandome en el nombre de los nuevos checkboxes, pero no lo he conseguido xD.

Por ejemplo:

Código
  1. Panel1.Controls.Add(newCheckBox)
  2. newCheckBox.Name = "checkbox" & List.ToString()

Eso se llamará checkbox1, pues quisiera crear una nueva entrada (o reemplazar una ya existente con el mismo nombre) en my.settings, que tenga el mismo nombre que el "checkbox.Name", y poder obetener el valor de esa entrada.

Osea, crear la entrada "checkbox1" en my.settings, y obtener el valor de "checkbox1" en my-settings, las dos cosas necesitaría,pero sobretodo obtener el valor...

Yo se obtener y guardar valores en my.settings, pero no se hacerlo cuando el nombre que le intento dar al "my.settings" es el objeto "newCheckBox.Name = "checkbox" & List.ToString()"
Si uso "My.settings.newCheckBox.Name" me dice que no es un string, con toda la razón xD.

Muchas gracias por tu tiempo Kubox!


« Última modificación: 19 Noviembre 2012, 14:17 pm por EleKtro H@cker » En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #8 en: 19 Noviembre 2012, 16:34 pm »

Ya he acoplado tu code a mi form, muchas gracias de nuevo

Lo que intento hacer es guardar en las settings los checkboxes que están clickados antes de cerrar el form:

Código
  1.    ' función que se ejecuta cuando cualquier checkbox es clickado
  2.    Public Sub LlamadaCheckBox(ByVal sender As Object, ByVal e As System.EventArgs)
  3.        Dim CheckboxN As CheckBox = CType(sender, CheckBox) 'a partir del sender creo el CheckBox (paso de objet a CheckBox para poder utilizar sus propiedades)
  4.        MsgBox(CheckboxN.Name)
  5.        If CheckboxN.Checked = True Then My.Settings.Selected_Checkboxes.Add(CheckboxN.Name.ToString())
  6.    End Sub

pero me dice: Object reference not set to an instance of an object.

La setting la tengo como tipo: "system.collection.specialized.stringcollection", no se si es la correcta.



Una vez conseguido eso, al volver a abrir la app (el form) necesitaría averiguar cuales checkboxes estaban clickados para seleccionarlos automáticamente


ojalá puedas ayudarme con eso
En línea


kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.442


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #9 en: 19 Noviembre 2012, 17:00 pm »

Una vez conseguido eso, al volver a abrir la app (el form) necesitaría averiguar cuales checkboxes estaban clickados para seleccionarlos automáticamente

En ese momento deberias cargar las propiedades e ir comparando uno a uno los valores de las propiedades y si esta en True (Clickado) pues activar la propiedad Checked del CheckBox. Es decir, PropiedadCheckBox1 -> ¿True? -> Sí -> Activar CheckBox1 .. saltar ala siguiente propiedad.

No he probado el código, hace mil que no utilizo propieadades de forma dinámica (on the fly) pero bueno, este código lo que hace es generar X propiedades por cada X CheckBoxes que haya en una matriz mCheckBox (lo de la matriz lo puedes cambiar recorriendo por ejemplo los controles del Panel donde estén los CheckBox)

Código
  1.    Private Sub GenerarPropiedades(ByVal mCheckBox As CheckBox())
  2.        For Each checkboxN As CheckBox In mCheckBox 'por cada CheckBox en mCheckBox
  3. 'Creo una propiedad con el nombre del CheckBox
  4. 'De esta forma cada CheckBox tendrá una propiedad equivalente
  5.            My.Settings.Properties.Add(New Configuration.SettingsProperty(checkboxN.Name))
  6. 'Meto el valor de la propiedad Checked en la nueva propiedad que hemos creado para el CheckBox
  7.            My.Settings.Properties.Item("CheckBox").DefaultValue = checkboxN.Checked
  8.        Next
  9.        My.Settings.Save()
  10.    End Sub
  11.  

Gracias por tu atención :)

Si necesitas ayuda para el siguiente caso (Cargar los CheckBoxes tildados mediante las propiedades) avisa.

Saludos!
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Páginas: [1] 2 3 4 5 6 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines