(solucionado) ¿clonar evento para varios elementos? ¿FOR?

Iniciado por Eleкtro, 18 Noviembre 2012, 12:39 PM

0 Miembros y 4 Visitantes están viendo este tema.

Eleкtro

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 (VB) [Seleccionar]
   Public Sub C1CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles C1CheckBox1.CheckedChanged
       If C1CheckBox1.Checked = True Then My.Settings.box1_selected = "Y" Else My.Settings.box1_selected = "N"
       Dim checkedpath1 = C1CheckBox1.Text
   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...








Danyfirex

#1
Si pones tus checkboxs en un groupbox puedes hacer esto.

Código (vbnet) [Seleccionar]
Dim ChkBox As CheckBox = Nothing

       For Each xObject As Object In Me.GroupBox1.Controls
           If TypeOf xObject Is CheckBox Then
               ChkBox = xObject
               ChkBox.Checked = True
           End If
       Next



creo que a eso te refieres.

y sin Groupbox así:

Código (vbnet) [Seleccionar]
For Each ctrl As Control In Me.Controls

            If TypeOf ctrl Is CheckBox Then
                DirectCast(ctrl, CheckBox).CheckState = CheckState.Checked
            End If

        Next


saludos.

Eleкtro

#2
Hola,

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

Código (vbnet) [Seleccionar]
     For Each ctrl As Control In Me.Controls
           If TypeOf ctrl Is CheckBox Then
               DirectCast(ctrl, CheckBox).Text = "Test"
           End If
       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?








kub0x

#3
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 (VB.NET) [Seleccionar]

Public Class Form1

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


Espero haberte servido de ayuda!

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

Visita mi perfil en ResearchGate


criskapunk

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.

Eleкtro

#5
Cita de: kub0x en 18 Noviembre 2012, 20:41 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 (vbnet) [Seleccionar]
 Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       playertextbox.Text = My.Settings.playerpath
       foldertextbox.Text = My.Settings.folderpath
       updatefoldernames()
   End Sub

   Public Sub updatefoldernames()
       Dim List As Integer = 0
       Dim posy As Integer = 10

       filesystem = CreateObject("Scripting.FileSystemObject")
       ThisDir = filesystem.GetFolder(My.Settings.folderpath)

       For Each folder In ThisDir.Subfolders
           List = List + 1
           posy = posy + 20
           Dim newCheckBox As New CheckBox()
           Panel1.Controls.Add(newCheckBox)
           newCheckBox.Name = "checkbox" & List.ToString()
           newCheckBox.Text = folder.name
           newCheckBox.Location = New Point(10, posy)
           'MessageBox.Show(newCheckBox.Name.ToString())

           Dim checkbox_selected As String = "checkbox" & List.ToString()
           If My.Settings.checkbox_selected = "Y" Then newCheckBox.Checked = True
       Next
   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








kub0x

#6
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!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


Eleкtro

#7
Cita de: kub0x en 19 Noviembre 2012, 08:47 AMbuscas 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:
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 (vb) [Seleccionar]
Panel1.Controls.Add(newCheckBox)
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!










Eleкtro

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 (VBNET) [Seleccionar]
   ' función que se ejecuta cuando cualquier checkbox es clickado
   Public Sub LlamadaCheckBox(ByVal sender As Object, ByVal e As System.EventArgs)
       Dim CheckboxN As CheckBox = CType(sender, CheckBox) 'a partir del sender creo el CheckBox (paso de objet a CheckBox para poder utilizar sus propiedades)
       MsgBox(CheckboxN.Name)
       If CheckboxN.Checked = True Then My.Settings.Selected_Checkboxes.Add(CheckboxN.Name.ToString())
   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








kub0x

Cita de: EleKtro H@cker en 19 Noviembre 2012, 16:34 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 (VB.NET) [Seleccionar]

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


Gracias por tu atención :)

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

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

Visita mi perfil en ResearchGate