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

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

0 Miembros y 1 Visitante están viendo este tema.

Keyen Night

Cita de: Novlucker en 20 Noviembre 2012, 14:12 PM
Necesito un resumen :xD

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 :-X :xD El problema se ha desbordado un poco no?
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

#41
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 :P

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

Visita mi perfil en ResearchGate


Eleкtro

#42
Cita de: Novlucker en 20 Noviembre 2012, 14:12 PM
  • 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.




Cita de: Keyen Night en 20 Noviembre 2012, 14:13 PM
x2 Yo también iba a publicar lo mismo :-X :xD 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.




Cita de: kub0x en 20 Noviembre 2012, 14:27 PM
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?

Cita de: kub0x en 20 Noviembre 2012, 14:27 PM
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








Novlucker

#43
Lo he hecho rápidamente, el código es MUY mejorable :P

Código (csharp) [Seleccionar]
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)
               if (c is CheckBox && ((CheckBox)c).Checked)
                       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
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

@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.

- Nice to see you again -

seba123neo

#45
me lei todo y todavia no entendi :xD, 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.

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

Cita de: Novlucker en 20 Noviembre 2012, 15:17 PMLo he hecho rápidamente, el código es MUY mejorable :P
Gracias Nov!

Pero antes de convertilo a NET... perdona la ignoracía: ¿Que co** se supone que hace ese form?  :xD ¿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é!




Cita de: HdM en 20 Noviembre 2012, 15:35 PM
@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) :xD

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...




@seba123neo

Lo 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 :xD

Un saludo.








kub0x

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

Visita mi perfil en ResearchGate


Novlucker

#48
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 ejemplo

Saludos
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

Ok, pues si te funca bien con el cambio, perfecto entonces. Cuando lo comercialices y te forres, acuérdate de los amigos  :silbar: XDDDD

- Nice to see you again -