SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => VB .NET => Mensaje iniciado por: giorgione en Lunes 18 de Mayo de 2009, 06:00

Título: Agregar columnas a un ListView usando un for
Publicado por: giorgione en Lunes 18 de Mayo de 2009, 06:00
Estoy haciendo una aplicacion en la que al ingresar en un NumericUpDown un numero, me muestre un ListView con el numero de columnas especificadas en ese numero
Por decir si yo escribo 4 me debe salir 4 columnas he estado intentando con esto:

Código: vb.net
  1. Sub LlenaColumna()
  2.         Dim i As Integer
  3.         Dim limite As Integer
  4.  
  5.         limite = FrmNuevo.NudSa.Value
  6.  
  7.         For i = 0 To limite
  8.            
  9.             Me.LsvZ.Columns.Add("C" & i)
  10.         Next
  11.     End Sub
  12.  
  13.  

el Numeric lo he llamado NudSa y esta en otro form la var limite recoge ese valor y realiza el bucle
el ListView es LsvZ y a cada columna le agrego un numero junto con la letra C

GRacias de antemano
Título: Re: Agregar columnas a un ListView usando un for
Publicado por: Nebire en Lunes 18 de Mayo de 2009, 13:00
Lo tienes prácticamente bien...

Código: Visual Basic
  1.  
  2. ' en el form frmnuevo
  3. '     las propiedades max y min deberían limitarse para que se obtenga un número mínimo y máximo de columnas, tener 100.000 columnas no tiene sentido.
  4. private sub NudSa__ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NudSa.ValueChanged
  5.     call LlenaColumna(NudSa.value)
  6. end sub
  7.  
  8. ' en el 'otro' formulario...que lo quieres usar
  9. public Sub LlenaColumna(byval Columnas as integer)
  10.         Me.LsvZ.Columns.clear ' borramos las que tenía previamente, si no con cada llamada el número aumenta.
  11.         For i as integer= 0 To Columnas -1 ' porque de  0 a 10 hay 11 elementos, no 10
  12.            
  13.             Me.LsvZ.Columns.Add("C" & i.tostring)
  14.         Next
  15. End Sub
  16.  
  17.  

No obstante el problema que tu tienes se remite a que no identificas claramente como trabaja el listview, para empezar para poder ver el nº de columnas es necesario establecer la propiedad view a 'Details', ya que el control listview está diseñado par apoderse utilizar en diferentes situaciones, en tu caso esa situación es 'details'...
Luego debes entender que dentro de un listview hay varias colecciones, las columnas sólo son las cabeceras 'posibles que queremos mostrar, podemos fijar 5 columnas y sin embargo por 'detrás' tener 20.
Para manejar las filas como un todo,  debemos usar la colección items, y para manejar las 'columnas' en cada iten debemos trabajar con la colección subitems, como los subitems pertenecen a un item concreto puede resultar confuso hasta que se entienda como trabaja. Para ello te he elaborado el siguiente código, que espero te ayude a entender mejor el control listview.
Nota que para entenderlo adecuadamente debes ejecutarlo paso a paso, y para que puedas ir viendo los resultado sobre la marcha en el formulario (pon aun lado del monitor el código y a otro el formulario de modo que ambas partes queden a la vista, si el monitor es estrecho, entonces distribúyelo verticalmente, pero ambos deben estar a la vista al mismo tiempo) he provisto en el código varias línas que actualizan la vista del formulario, de modo que puedas ver el cambio efectuado en cada 'acción'.
Recuerda que las líneas 'System.Windows.Forms.Application.DoEvents()' sólo tienen aquí sentido para poder referescar la imagen mientras estás ejecutando paso a paso el código, para una ejecución normal hay que comentarlas o eliminarlas.
Código: Visual Basic
  1.  
  2. Public Class Form1
  3.     ' establecemos el tipo de vista que necesitamos, nuestro caso es detalles
  4.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  5.         ListView1.View = View.Details ' si no no se verán las columnas
  6.     End Sub
  7.  
  8.     ' actualizamos al número de columnas elegido.
  9.     Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
  10.         Call LlenaColumna(sender.value)
  11.     End Sub
  12.  
  13.     ' creamos 10 items por cadacolumna para ilustrar el ejemplo.
  14.     Public Sub LlenaColumna(ByVal Columnas As Integer)
  15.         Dim nuevaSubIt() As Windows.Forms.ListViewItem.ListViewSubItem
  16.  
  17.         ' borramos las que tenía previamente, si no con cada llamada el número aumenta.
  18.         Me.ListView1.Columns.Clear()
  19.         Me.ListView1.Items.Clear()
  20.        
  21.         System.Windows.Forms.Application.DoEvents()
  22.         For Col As Integer = 0 To Columnas - 1 ' porque de  0 a 10 hay 11 elementos, no 10, restamos 1
  23.             Me.ListView1.Columns.Add("Columna" & Col.ToString, 120) ' texto y ancho
  24.  
  25.             ' si la columna ya fue creada podemos usar estas otras líneas para modificar esos valores
  26.             '   ListView1.Columns(Col).Text = "Columna" & Col.ToString      ' texto de la columna
  27.             '   ListView1.Columns(Col).Width = 120                          ' ancho de la columna  
  28.         Next
  29.         System.Windows.Forms.Application.DoEvents()
  30.         ReDim nuevaSubIt(0 To Columnas - 1)
  31.         For It As Byte = 0 To 9 ' 9 itemes
  32.             Me.ListView1.Items.Add("Item" & It.ToString) ' columna 0
  33.             System.Windows.Forms.Application.DoEvents()
  34.  
  35.             For Col As Integer = 1 To Columnas - 1
  36.                 nuevaSubIt(Col) = New Windows.Forms.ListViewItem.ListViewSubItem(ListView1.Items(It), "Item" & It.ToString & "_Columna" & Col.ToString)
  37.  
  38.                 ' si ya han sido creado los subitems, usaríamos esta línea
  39.                 'Me.ListView1.Items(It).SubItems(Col).Text = "Item" & It.ToString & "_Columna" & Col.ToString
  40.             Next
  41.             Me.ListView1.Items(It).SubItems.AddRange(nuevaSubIt)
  42.             System.Windows.Forms.Application.DoEvents()
  43.         Next
  44.     End Sub
  45. End Class
  46.  
  47.  

El código no está optimizado, ten en cuenta que en cada cambio de columnas, lo borra todo y lo rehace de nuevo, un caso acertado es trabajar sólo con la diferencia de columnas entre la actual y la seleccionada, esto es si ahora tengo 15 columnas y luego marco 12, todo lo que tendría que hacer es eliminar las últimas 3 columnas, en cambio si ahora tengo 7 columnas y luego marco 13 lo que se debería hacer es añadir las 6 nuevas columnas, dejando intactas las existentes... pero esto es ya ejecrcicio para ti, la base ya la tienes.
Título: Re: Agregar columnas a un ListView usando un for
Publicado por: giorgione en Martes 19 de Mayo de 2009, 06:17
Muchas gracias el codigo funciona