|
1173
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 20 Noviembre 2012, 17:34 pm
|
Lo que hace NovLucker es guardar los subdirectorios de una ruta en un archivo xml serializado en funcion del Checkbox, pues si éste está checkado guarda la ruta . Posteriormente puedes acceder a dichos datos a través de GetSavedsPaths() e ir checkando los CheckBoxes.Sería algo como "tus rutas de música favoritas". Buen aporte sin duda Estoy ciego, gracias HdM por aportar la solución pues no ví que se borraban los CheckBoxes dibujados al llamar a updatecheckboxes() y me lié pensando en otra cosa xD. Debería funcionar bien, ya que cargas la última ruta, obtienes los indices checkados y dibujas los Checkboxes (Todo en el evento Load) . Al quitar el método CargarPropiedades() de updatecheckboxes() te aseguras que si cargas una nueva ruta, se dibujen nuevos CheckBoxes y no haya conflictos si la cantidad es menor a la anterior. Disfruta de la app
|
|
|
1174
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 20 Noviembre 2012, 14:27 pm
|
Encontré el error, es lo que te dije antes y no es por el código si no por las rutas cargadas. Esta vez te lo intentaré explicar lo mejor posible cuando se inicia la App se dibujan los CheckBoxes de la ruta actual. Si cargas mas rutas a través del FolderButton() entonces se añaden mas CheckBoxes (la matriz mCheck tendrá mas índices). Hasta ahí bien. Aunque llames a CargarPropiedades() todo seguirá bien ya que tendrás los mismos índices que cuando cargaste la primera ruta. El problema se presenta al cerrar la aplicación, pues imagínate que la ruta que cargaste al principio del programa genera 10 Checkboxes y la que cargaste con FolderButton genera 5 CheckBoxes más. Si antes de cerrar el programa tildaste el CheckBox 12,13 y 14 cuando abras la App otra vez sólo se dibujarán los CheckBoxes de la última ruta cargada (los 5 que generaste mediante FolderButton). Entonces la matriz mCheck tendrá 5 índices y le será imposible acceder al índice 12,13 y 14 pues esos índices los generaste cuando tenías 15 CheckBoxes Y AHORA TIENES 5 no los 15 que generaste por última vez (cargas el último directorio asignado a la propiedad, no los anteriores :/) Tienes que idear un método para que se carguen las últimas rutas cargadas en el formulario, de esta forma podrás dibujar todos los CheckBoxes de ambas rutas y posteiormente comprobar si fueron tildados la última vez. Puedes hacerlo con una propiedad que guarde una matriz de cadenas String(). Espero que lo entiendas, pues el error es bastante crítico xD Si no lo entendieras pues podría ayudarte mediante código, pero estaría bien que pudieras arreglarlo pues es la mejor manera de comprender el funcionamiento del programa. Cualquier duda aquí me tienes. Saludos!
|
|
|
1175
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 20 Noviembre 2012, 12:50 pm
|
Buenas EleKtro!
Te diría que debugeases la applicación o bien poniendo Breakpoints en los puntos que te interesa evaluar o bien llendo paso a paso por sentencia. Si cargas la app y el directorio es C:\ se dibujaran tantos CheckBoxes como directorios en C:\. Luego imaginate que cargas C:\musica, entonces se añadiran tantos CheckBox como directorios en C:\musica haya, pero claro, estas guardando en la propiedad FolderPathName el ultimo directorio cargado. Si inicias la app otra vez la propiedad que guarda el indice de los CheckBoxes checkados tendra un tamaño mayor a la que se espera pues solo estas dibujando tantos Checkbox como directorios en C:\musica, pero resulta que tambien cargas los de C:\ pues antes al cerrar la aplicación se guardaron los de C:\ y C:\musica.
No sé si ése será el error, el código parece estar bien. Ojala mis ojos fueran un debugger pero a tanto no llego xD como ultimo recurso pasame la solucion del proyecto y te busco el error.
Saludos!
|
|
|
1176
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 20 Noviembre 2012, 09:59 am
|
Cuando dibujas nuevos controles la cantidad de CheckBoxes no tiene porque ser la misma que la anterior. Si tenias 20 CheckBoxes ya que encontraste 20 subdirectorios, y luego llamas al FolderBrowserDialog() quizás tengas una mayor cantidad de Controles y por eso es por lo que obtienes un error en conjunto con la propiedad. Me explico, si antes tenias 20 CheckBoxes en la matriz y ahora encontraste 10 subdirectorios pues en la matriz tendrás 30 ya que tienes que resetearla. Otro error es que antes tuvieras el Checkbox10 activado y ahora solo tengas dibujados 7 CheckBoxes e intentes Checkar ese 10. (Ahí te salta error en lo que dijiste de la proiedad). Para resetear la matriz llama a este método No he probado el código, ni tampoco le he dado muchas vueltas (estoy en clase ) pero te adjunto algo: Dim mCheck(0) As CheckBox Private Sub UpdateArray() Array.Clear(mCheck, 0, mCheck.Length) Array.Resize(mCheck, 0) End Sub
Saludos!
|
|
|
1177
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 20 Noviembre 2012, 00:48 am
|
Gracias HdM por sacar el error, pues éste es vital para el posterior funcionamiento. Para cambiar el tipo de propiedad en My.Settings hay que hacerlo de forma manual, especificando en la propiedad en el archivo Designer.Vb el tipo Integer() o Int32(). He modificado el código para que no Checkee CheckBoxes que no fueron seleccionados, ahora se trabaja con una propiedad llamada "Valores" que guarda una lista de enteros que representa los índices de los CheckBoxes que fueron tildados al cerrar el programa. Al iniciar la aplicación se dibujan los CheckBoxes y se procede a comprobar la propiedad. El código está mal estructurado, pero EleKtro, es para que puedas ver lo que hago de forma simple. Recuerda que hay que ser limpios xD Public Class Form1 Dim mcheck(0) As CheckBox Private Sub CargarPropiedades() 'Obtenemos la Lista de Enteros de los índices Checkados Dim ListaCheckados As Int32() = My.Settings.Valores For i As Int32 = 0 To mcheck.Length - 1 'Recorro los CheckBoxes For Each indiceCheckado As Int32 In ListaCheckados 'Por cada indice de CheckBoxes checkados 'Como se los indices de los CheckBoxes checkados, accedo a éstos mediante el Array de los CheckBoxes 'Ej -> indiceCheckado : 3 (CheckBox3) ; 'Por lo tanto indiceCheckado - 1 = 2, mCheck(0) = check1, ... m(2) = CheckBox3 'Es decir el índice N - 1 siempre corresponderá a CheckBoxN mcheck(indiceCheckado - 1).Checked = True Next Next End Sub Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Dim mCheckados(0) As Int32 'matriz que guardará los indices de los CheckBoxes checkados Dim Cuantos As Int32 = 0 'cuantos CheckBoxes estan checkados For i As Int32 = 0 To mcheck.Length - 1 'Recorro los CheckBoxes en busca de Checkados If mcheck(i).Checked = True Then Cuantos += 1 'Sumamos un indice por CheckBox checkado Array.Resize(mCheckados, Cuantos) mCheckados(Cuantos - 1) = i + 1 'metemos en el indice del Array el elemento Checkado (RECUERDA SE EMPIEZA DESDE 0) 'Por eso lo de Cuantos - 1 (Si tienes 7 Checkados ira desde 0 hasta 6 ...) End If Next My.Settings.Valores = mCheckados 'Actualizamos la propiedades Int32() My.Settings.Save() End Sub Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load For i As Int32 = 0 To 20 Array.Resize(mcheck, i + 1) mcheck(i) = New CheckBox With mcheck(i) .Name = "CheckBox" & i + 1 .Text = mcheck(i).Name .Location = New Point(40, i * 40) End With Me.Controls.Add(mcheck(i)) Next CargarPropiedades() End Sub End Class
Espero que te haya servido de ayuda, Saludos!
|
|
|
1178
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 19 Noviembre 2012, 23:29 pm
|
El fallo está en que tu escribes CheckBox0 y cuando cargas las propiedades esperas un CheckBox1,2,3,4 no el 0 xD Para ello cuando generes los CheckBoxes empieza desde i=0, suma i+1 a la propiedad .Name y .Text de los CheckBoxes y y al final del for suma 1 como te dije, para ReSizear el Array, a mí me funciona :S
|
|
|
1179
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 19 Noviembre 2012, 23:21 pm
|
' update checkboxes Public Sub updatecheckboxes() Dim filesystem = CreateObject("Scripting.FileSystemObject") Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath) Dim i As Int32 = 0 For Each folder In ThisDir. Subfolders mCheck(i) = New CheckBox() MessageBox.Show("test") Me.Panel1.Controls.Add(mCheck(i)) With mCheck(i) .Name = "Checkbox" & i +1 'De esta forma sumas 1 y tendrás CheckBox1,2,3 .Text = "CheckBox" & i+1 'Lo mismo para el nombre .Location = New Point(10, i * 20) End With AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox i = i + 1 Array.Resize(mCheck, i) Next CargarPropiedad() End Sub
|
|
|
1180
|
Programación / .NET (C#, VB.NET, ASP) / Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
|
en: 19 Noviembre 2012, 23:09 pm
|
Nótese que actualizo la variable i y ReSizeo el Array al final del for, para que no tengas que cambiar nada. ' update checkboxes Public Sub updatecheckboxes() Dim filesystem = CreateObject("Scripting.FileSystemObject") Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath) Dim i As Int32 = 0 For Each folder In ThisDir. Subfolders mCheck(i) = New CheckBox() MessageBox.Show("test") Me.Panel1.Controls.Add(mCheck(i)) With mCheck(i) .Name = "Checkbox" & i .Location = New Point(10, i * 20) End With AddHandler mCheck(i).CheckedChanged, AddressOf LlamadaCheckBox i = i + 1 Array.Resize(mCheck, i) Next CargarPropiedad() End Sub
|
|
|
|
|
|
|