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

 

 


Tema destacado:


+  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 28,401 veces)
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #40 en: 20 Noviembre 2012, 14:13 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?


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 Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #41 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 :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!


« Última modificación: 20 Noviembre 2012, 14:29 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.885



Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #42 en: 20 Noviembre 2012, 15:02 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.



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.



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 Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


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

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

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Xml.Serialization;
  11.  
  12. namespace WindowsFormsApplication1
  13. {
  14.    public partial class Form1 : Form
  15.    {
  16.        public Form1()
  17.        {
  18.            InitializeComponent();
  19.        }
  20.  
  21.        private void Form1_Load(object sender, EventArgs e)
  22.        {
  23.            List<string> savedPath = GetSavedPaths();
  24.            DirectoryInfo folder = new DirectoryInfo(@"D:\Tools\");
  25.            DirectoryInfo[] subFolders = folder.GetDirectories();
  26.            int top = 10;
  27.            foreach (DirectoryInfo subFolder in subFolders)
  28.            {
  29.                CheckBox c = new CheckBox() { Left = 20, Top = top, AutoSize = true, Text = subFolder.FullName};
  30.                c.Checked = savedPath.Contains(subFolder.FullName);
  31.                c.CheckedChanged += new System.EventHandler(this.checkBox_CheckedChanged);
  32.                top += 20;
  33.                this.Controls.Add(c);
  34.            }
  35.        }
  36.  
  37.        private void SavePaths()
  38.        {
  39.            List<string> paths = new List<string>();
  40.  
  41.            foreach (Control c in Controls)
  42.                if (c is CheckBox && ((CheckBox)c).Checked)
  43.                        paths.Add(c.Text);
  44.  
  45.            using (StreamWriter sw = new StreamWriter("setting.xml"))
  46.            {
  47.                XmlSerializer serializer = new XmlSerializer(typeof(List<string>));
  48.                serializer.Serialize(sw, paths);
  49.                sw.Flush();
  50.            }
  51.        }
  52.  
  53.        private List<string> GetSavedPaths()
  54.        {
  55.            List<string> paths;
  56.  
  57.            try
  58.            {
  59.                using (StreamReader sr = new StreamReader("setting.xml"))
  60.                {
  61.                    XmlSerializer serializer = new XmlSerializer(typeof(List<string>));
  62.                    paths = (List<string>)serializer.Deserialize(sr);
  63.                }
  64.            }
  65.            catch
  66.            {
  67.                paths = new List<string>();
  68.            }
  69.  
  70.            return paths;
  71.        }
  72.  
  73.        private void checkBox_CheckedChanged(object sender, EventArgs e)
  74.        {
  75.            MessageBox.Show(((CheckBox)sender).Text);
  76.        }
  77.  
  78.        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  79.        {
  80.            SavePaths();
  81.        }
  82.    }
  83. }
  84.  

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 Desconectado

Mensajes: 1.674



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

@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


Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #45 en: 20 Noviembre 2012, 16:00 pm »

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.

« Última modificación: 20 Noviembre 2012, 16:01 pm por seba123neo » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



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

Lo 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é!



@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.
En línea



kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [VS] ¿clonar evento para varios elementos? ¿FOR?
« Respuesta #47 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 :D
« Última modificación: 20 Noviembre 2012, 17:42 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

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


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

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
« Ú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 Desconectado

Mensajes: 1.674



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

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

- Nice to see you again -
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