Autor
|
Tema: (solucionado) ¿clonar evento para varios elementos? ¿FOR? (Leído 28,193 veces)
|
Keyen Night
Desconectado
Mensajes: 496
Nothing
|
Necesito un resumen En tu app; - Seleccionas un directorio
- Listas todos los subdirectorios
- Creas un checkbox por cada subdirectorio
- ¿Para que son las settings?
Saludos x2 Yo también iba a publicar lo mismo El problema se ha desbordado un poco no?
|
|
|
En línea
|
La Fé Mueve Montañas... ...De Dinero
La programación es más que un trabajo es más que un hobby es una pasión...
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
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!
|
|
« Última modificación: 20 Noviembre 2012, 14:29 pm por kub0x »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.878
|
- Seleccionas un directorio
- Listas todos los subdirectorios
- Creas un checkbox por cada subdirectorio
- ¿Para que son las settings?
Hola Novlucker, Me sirvo de la setting/propiedad para almacenar la referencia de los checkboxes que están seleccionados antes de cerrar la app, al volver a abrir la app se recorre la propiedad buscando los checkboxes de "la última sesión" para que se seleccionen automáticamente.
x2 Yo también iba a publicar lo mismo El problema se ha desbordado un poco no? La verdad es que sí, me parece increible que este tipo de MINI-aplicación tán insignificante requiera tanto esfuerzo.
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
por esa regla de trés, una posibilidad sería, como los checkboxes tildados se guardan en la propiedad "valores", pues vaciar la propiedad antes de cargar la nueva ruta... ¿Me equivoco o voy bien? 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().
Si lo que he comentado en la cita anterior es así entonces puedo omitir el tener que idear ese método... ¿no? Kubox, entenderlo lo entiendo (o eso creo), otra cosa es que tenga idea de como idear ese método para solventarlo, y sí... es un error muy crítico, y jod*er, si consigo arreglar eso ya tengo la aplicación hecha. Vamos que en resumen, el error reside en que en "valores" se guardan los indices de la última ruta cargada, y claro al cargar una ruta nueva (Si tiene menos checkboxes o más que el indice) se jode todo... ¿no? Pues como no tengo ni idea de idear nada semejante para arreglarlo, esto me parece más sencillo (pero no se si es posible hacerlo), a ver que opinas: 1. Se ejecuta la app (el primer uso de la app), aki no hay ninguna carpeta cargada porque se tiene que usar el botón del FolderBrowserDialog para cargarla. 2. Le damos al botón y cargo una ruta, se indexa y se guarda. 3. pincho en algunos checkboxes. 3. Ahora me apetece cargar otra ruta, pues sigo el mismo procedimiento del paso 2, pero esta vez, justo antes de cargar la nueva ruta, vacío la propiedad "valores", osea, lo dejo como estaba al princpio, con un valor de "0", elimino todas las "entradas" que hubiera en la propiedad "Valores", así ya no hay problemas con el índice ni con nada y los checkboxes se crearían y se indexarían correctamente como en el primer uso del programa, y al cerrarse se cerraría correctamente porque "valores" solo contendría los valores de esta ultima ruta cargada...Solo es un planteamiento... ¿Está bien?, ¿Es posible hacerlo? Un saludo
|
|
« Última modificación: 20 Noviembre 2012, 15:04 pm por EleKtro H@cker »
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Lo he hecho rápidamente, el código es MUY mejorable using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml.Serialization; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { List<string> savedPath = GetSavedPaths(); DirectoryInfo folder = new DirectoryInfo (@"D:\Tools\"); DirectoryInfo[] subFolders = folder.GetDirectories(); int top = 10; foreach (DirectoryInfo subFolder in subFolders) { CheckBox c = new CheckBox () { Left = 20, Top = top, AutoSize = true, Text = subFolder .FullName}; c .Checked = savedPath .Contains(subFolder .FullName); c .CheckedChanged += new System.EventHandler(this.checkBox_CheckedChanged); top += 20; this.Controls.Add(c); } } private void SavePaths() { List <string> paths = new List <string>(); foreach (Control c in Controls) paths.Add(c.Text); using (StreamWriter sw = new StreamWriter ("setting.xml")) { XmlSerializer serializer = new XmlSerializer (typeof(List <string>)); serializer.Serialize(sw, paths); sw.Flush(); } } private List<string> GetSavedPaths() { List<string> paths; try { using (StreamReader sr = new StreamReader ("setting.xml")) { XmlSerializer serializer = new XmlSerializer (typeof(List <string>)); paths = (List<string>)serializer.Deserialize(sr); } } catch { paths = new List <string>(); } return paths; } private void checkBox_CheckedChanged(object sender, EventArgs e) { MessageBox.Show(((CheckBox)sender).Text); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { SavePaths(); } } }
Saludos
|
|
« Última modificación: 20 Noviembre 2012, 15:57 pm por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
HdM
Desconectado
Mensajes: 1.674
|
@Novlucker: jajaja, estás en la champions.
@EleKtro: ¿Por qué no sacas el CargarPropiedades() fuera del updatecheckboxes()? Si no entiendo mal lo que quieres hacer, sólo se debe pasar por el CargarPropiedades() al iniciar la app., ¿no? De modo que ¿para qué pasar por ese sub cada vez se llama a updatecheckboxes()?
Saludos.
|
|
|
En línea
|
- Nice to see you again -
|
|
|
seba123neo
|
me lei todo y todavia no entendi , en realidad entendi, pero no cual es el problema, es simplemente guardar el estado de los checkbox y la ultima ruta que seleccionaste. pero como tenes 2 rutas se te borran las anteriores, pues simplemente guardas para cada path determinado tanta cantidad de checkboxes y de esa forma cada ves que cambias de ruta tenes lo ultimo que seleccionaste. por ejemplo la carpeta c:\prueba genera 2 checkbox, tildas los 2 por ejemplo: - check 1 - check 2 despues vas y seleccionas la carpeta c:\prueba2 que genera 3 checkboxes mas (aca ya tenes que guardar los checkboxes anteriores, y guardar la ruta tambien). - check 1 - check 2 - check 3 supongamos que tildas los 3. entonces si ahora vas y seleccionas otra ves la carpeta anterior c:\prueba debes cargar los primeros 2 check. o sea el path es lo que importa aca, despues segun el path cargas los checkbox que se crearon. pero antes tendrias que hacer una validacion tambien de si existe la carpeta, porque si yo voy y borro un subdirectorio y despues cargas los valores guardados ese directorio no existe mas, por lo tanto el checkbox tampoco deberia aparecer.
|
|
« Última modificación: 20 Noviembre 2012, 16:01 pm por seba123neo »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Conectado
Mensajes: 9.878
|
Lo he hecho rápidamente, el código es MUY mejorable Gracias Nov! Pero antes de convertilo a NET... perdona la ignoracía: ¿Que co** se supone que hace ese form? ¿Es una posible solución al problema que he expuesto? ¿O es un ejemplo de otra cosa?, es que yo solo veo un form en C# a simple vista xD, explícame un poco que es, ché!
@EleKtro: ¿Por qué no sacas el CargarPropiedades() fuera del updatecheckboxes()? Si no entiendo mal lo que quieres hacer, sólo se debe pasar por el CargarPropiedades() al iniciar la app., ¿no? ... ... ... OMG Pues sí !!, modificandolo de lugar parece que se han solucionado todos los problemas (parece) Tán fácil como eso... para tí ha sido muy obvio ver donde estaba el fallo pero yo llevo una mañana entera sin poder verlo jaja, en fin, muchas gracias Hdm, aún tengo que testearlo un poco, que no me fío nada, me ha parecido demasiado fácil la modificación... Pero creo que esta vez si...
@ seba123neoLo mismo te digo, muchas gracias por la ayuda, pero creo que con la pequeña modificación que me dijo Hdm ya lo he dsolucionado y no me hará falta seguir los pasos que comentas. Lo de la validacion del directorio es algo importante y buena idea, me me lo apunto en el "ToDoList" de la app Un saludo.
|
|
|
En línea
|
|
|
|
kub0x
Enlightenment Seeker
Moderador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
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
|
|
« Última modificación: 20 Noviembre 2012, 17:42 pm por kub0x »
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
Ese código; - Al cargar el form carga las rutas de los checkbox guardados
- Lista los subdirectorios en D:\Tools (solo un ejemplo, ahora lo cambié a test)
- Crea un form con checkbox y sus paths
- Al dar click en un checkbox muestra el path correspondiente
- Al cerrar el form vuelve a guardar las rutas
carpeta1, carpeta2 son subdirectorios que cree para el ejemploSaludos
|
|
« Última modificación: 20 Noviembre 2012, 17:41 pm por Novlucker »
|
En línea
|
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD "Hay dos cosas infinitas: el Universo y la estupidez humana. Y de la primera no estoy muy seguro." Albert Einstein
|
|
|
HdM
Desconectado
Mensajes: 1.674
|
Ok, pues si te funca bien con el cambio, perfecto entonces. Cuando lo comercialices y te forres, acuérdate de los amigos XDDDD
|
|
|
En línea
|
- Nice to see you again -
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Crear copia para clonar en varios PCs?
GNU/Linux
|
JJMD
|
1
|
2,283
|
28 Febrero 2013, 23:09 pm
por portaro
|
|
|
Problema con un JMenuItem, no escucha evento de mouse (ya Solucionado)
Java
|
DarkSorcerer
|
1
|
3,270
|
23 Julio 2013, 12:19 pm
por Debci
|
|
|
Comparar checkbox con varios elementos
Programación Visual Basic
|
rapbyone
|
4
|
2,283
|
12 Febrero 2016, 18:50 pm
por fary
|
|
|
WhatsApp añade más elementos para usar la app en varios móviles a la vez
Noticias
|
wolfbcn
|
0
|
1,073
|
15 Noviembre 2019, 14:47 pm
por wolfbcn
|
|
|
¿Existe algún algoritmo para escribir las pemutaciones de n elementos sin almacenar las de n-1 elementos?
Programación General
|
fzp
|
3
|
5,270
|
24 Octubre 2021, 23:06 pm
por fzp
|
|