Generar CheckBox de manera automatica

Iniciado por rigorvzla, 16 Junio 2019, 19:42 PM

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

rigorvzla

Hola a todos, en este momento me encuentro con un asunto que no doy como solventarlo, necesito en un listbox, listar archivos, cosa que hace, mas necesito que al final me genere un checkbox con el cual evaluare si quiero o no instalar el programa

anexo el codigo que uso
private void CargaArchivos(string ruta)
       {
          System.Windows.Controls.CheckBox chb = new System.Windows.Controls.CheckBox();
           chb.Content = "Instalar";
           chb.IsChecked = false;
           chb.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Green);
           
           listProgramas.Items.Add(chb);

           string[] ubicacion = Directory.GetFiles(Environment.CurrentDirectory + ruta);
           double f;

           for (int i = 0; i < ubicacion.Length; i++)
           {
               FileVersionInfo info = FileVersionInfo.GetVersionInfo(ubicacion[i]);
               FileInfo file = new FileInfo(ubicacion[i]);

               if (file.Length < 1048576)
               {
                   f = file.Length / 1024;
                   listProgramas.Items.Add(file.Name + " Version: " + info.FileVersion + " Peso: " + f.ToString() + " Kb" + chb);
                   listProgramas.Items.Add(chb);
               }
               else
               {
                   f = file.Length / 1024;
                   double q = f / 1024;
                   listProgramas.Items.Add(file.Name + " Version: " + info.FileVersion + " Peso: " + Math.Round(q, 2).ToString() + " Mb" + chb);
                   listProgramas.Items.Add(chb);
               }
               
           }
       }


como ven el puede agregar el combobox al principio, pero luego queda ocupado y salta un error de no poder generarlo de nuevo, por otro lado si comentamos " listProgramas.Items.Add(chb);"

Nos fijamos en esta linea
listProgramas.Items.Add(file.Name + " Version: " + info.FileVersion + " Peso: " + Math.Round(q, 2).ToString() + " Mb" + chb);
o esta
listProgramas.Items.Add(file.Name + " Version: " + info.FileVersion + " Peso: " + f.ToString() + " Kb" + chb);
y no genera el checkbox, lo coloca como si fuera un .ToString() , alguien sabra como poder solucionar eso?

Serapis

#1
Es un código 'raro'...

De entrada que tiene que ver un objeto control, con una lista de ficheros?.
Cuál es el objetivo de añadir el nombre del control 'checkbox' a dicha lista?.

En los lenguajes de Microsoft, se permite tener "un miembro por defecto", como el miembro que será invocado figuradamente, cuando se indique solamente el nombre del objeto.

Habitualmente suele dejarse la propiedad nombre (de tipo string), como el miembro por defecto.
Así por ejemplo si tienes un botón llamado btnMover, al hacer un 'messagebox.Show (btnMover)' mostrásrá lo mismo que si se se hubiera escrito 'messagebox.Show(btnMover.Name)'

Por otro lado, si tu tienes un listbox (el supuesto llamado listProgramas), lo que añades son strings, pués es una colección de tipo string. Entonces correctamente añade el nombre del checkbox, no el propio control.
Para añadir el control debería ser una colección de controles, o más específicamente de 'checkboxes', o menos restrictivo, de objetos genéricos. (OBJECT es el tipo genérico, y tanto un string como un tipo de datos numérico o un control checkbox son objetos, ahora bien, por eficiencia suele convenir que si se conoce que tipos de objetos van a ser añadidos y son todos del mismo tipo, dicha colección sea homogénea, ...de ese mismo tipo. Y si no se sabe que tipos de objetos van a ser añadidos, pués sí, entonces es cuando convendría usar una colección heterogénea.

Entonces que añadas un string a una colección de strings (además varias veces pués está dentro de un bucle), es correcto, tu error es pués semántico. No entiendes lo que estás haciendo.

Si creas un control, lo lógico es que lo añadas a un contenedor de la interfaz de usuario, ...al form mismo de la ventana que esperes que deba estar, etc... y lo hagas visible cuando quieras que se vea e invisible cuando no desees que se vea.
Por lo mismo, ¿qué problema tendrías en añadirlo durante diseño de modo invisible y cuando proceda reposicionarlo y hacerlo visible?.

rigorvzla

hola de nuevo, lo q deseo hacer es en un list box, en cada linea del list box , quiero agregar un checkbox para poder hacerle click marcarlo o desmarcarlo, para poder evaluar eso y permitir o no la accion que quiero (instalar dicho programa listado).

imagine que asi seria una forma de hacerlo pero ... no resulto.

lo otro es que no  tengo una cantidad estatica de cuantos checkbox necesitare , eso lo determina el for que se muestra en el codigo, osea si en el listbox se muestran 10 archivos seria 10 checkbox uno en cada linea.

ese es el objetivo que deseo lograr.

Serapis

#3
Para permitir seleccionar más de 1 elemento a la vez en el listbox, conviene cambiar el valor de la propiedad selectionMode del listbox.

Una vez que dicha propiedad esté activada (mejor en diseño) , puede seleccionarse múltiples ítems en el listbox y puede acudirse despés a un bucle, o bien para recorrerlos todos y ver cuales están seleccionados, o bien obtener previamente una colección mediante "SelectedIndices" ó SelectedItems" y recorrer solo esos... es trivial lo uno o lo otro.

Código (vbnet) [Seleccionar]

For each ix as integer in listbox1.SelectedIndices
  ' lo que sea que deba hacerse... por ejemplo informar...
  messagebox.show "Ha decidido instalar el elemento: " & vbnewline & _
      ListBox1.Items.Item(ix).ToString
next

' si procede, al final deseleccinar todos...
listbox1.clearSelected
' o bien en el bucle deseleccionar elementos individuales según la acción que se realice.
'   por ejemplo si se van a instalar cosas, deseleccionar cada elemetno instalado y
'   dejar seleccionado aquellos que fallaron
'   (porque por ejemplo requieren la presencia de alguna librería ausente, etc...).




Entonces se hace innecesario añadir ningún chekbox más para algo que ya provee el propio control. Y simplifica el código necesario...

El usuario puede seleccionar o deseleccionar el ítem que desee, pulsando sobre él. Tú solo deberás proveer un botón para iniciar la acción correspondiente conforme a los ítems seleccionados (tal como se muestra en el bucle del escueto código de ejemplo).



p.d.: dicho de otra manera:
Cada elemento en un listbox puede actuar como un checkbox... en VS6 incluso había una propiedad 'Style' en el control listbox, que permitía mostrar gráficamente el ítem como un checkbox. Cambiando el valor de la propiedad selectionMode, permite la selección múltiple (simple o compleja de selección), luego actúan como 'checkbox', sin ello los elementos del listbox actúan como 'radiobuttons', así puede seleccionarse múltiples elementos.
Te basta informar convenientemente al usuario, añade un label encima del listbox, indicando algo como:
"Seleccione a continuación los elementos que desea instalar de la lista (y luego pulse el botón de confirmación)".

rigorvzla

CitarPara permitir seleccionar más de 1 elemento a la vez en el listbox, conviene cambiar el valor de la propiedad selectionMode del listbox.

Hombre! no sabia esto!! muchas gracias espero sea igual en wpf c#, si es asi como dices es innecesario crear un checkbox aparte como tu estas diciendo, y en efecto.
CitarUna vez que dicha propiedad esté activada (mejor en diseño) , puede seleccionarse múltiples ítems en el listbox y puede acudirse despés a un bucle, o bien para recorrerlos todos y ver cuales están seleccionados, o bien obtener previamente una colección mediante "SelectedIndices" ó SelectedItems" y recorrer solo esos... es trivial lo uno o lo otro.

CitarCada elemento en un listbox puede actuar como un checkbox... en VS6 incluso había una propiedad 'Style' en el control listbox, que permitía mostrar gráficamente el ítem como un checkbox. Cambiando el valor de la propiedad selectionMode, permite la selección múltiple (simple o compleja de selección), luego actúan como 'checkbox', sin ello los elementos del listbox actúan como 'radiobuttons', así puede seleccionarse múltiples elementos.
Te basta informar convenientemente al usuario, añade un label encima del listbox, indicando algo como:
"Seleccione a continuación los elementos que desea instalar de la lista (y luego pulse el botón de confirmación)".

este es mi pensar , al poder seleccionar dicho elemento con el checkbox, evaluar los q estan en tru y asi ejecutar la accion con un boton, me pondre a ver esa propiedad muchas gracias!!