CLR: .Net / Mono / Boo / Otros CLR > VB .NET

 Agregar columnas a un ListView usando un for

(1/1)

giorgione:
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 ---Sub LlenaColumna()        Dim i As Integer        Dim limite As Integer         limite = FrmNuevo.NudSa.Value         For i = 0 To limite                        Me.LsvZ.Columns.Add("C" & i)        Next    End Sub   
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

Nebire:
Lo tienes prácticamente bien...


--- Código: Visual Basic --- ' en el form frmnuevo'     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.private sub NudSa__ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NudSa.ValueChanged    call LlenaColumna(NudSa.value)end sub  ' en el 'otro' formulario...que lo quieres usar public Sub LlenaColumna(byval Columnas as integer)         Me.LsvZ.Columns.clear ' borramos las que tenía previamente, si no con cada llamada el número aumenta.        For i as integer= 0 To Columnas -1 ' porque de  0 a 10 hay 11 elementos, no 10                        Me.LsvZ.Columns.Add("C" & i.tostring)        NextEnd Sub   
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 --- Public Class Form1    ' establecemos el tipo de vista que necesitamos, nuestro caso es detalles    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        ListView1.View = View.Details ' si no no se verán las columnas    End Sub     ' actualizamos al número de columnas elegido.    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged        Call LlenaColumna(sender.value)    End Sub     ' creamos 10 items por cadacolumna para ilustrar el ejemplo.    Public Sub LlenaColumna(ByVal Columnas As Integer)        Dim nuevaSubIt() As Windows.Forms.ListViewItem.ListViewSubItem         ' borramos las que tenía previamente, si no con cada llamada el número aumenta.        Me.ListView1.Columns.Clear()        Me.ListView1.Items.Clear()                System.Windows.Forms.Application.DoEvents()        For Col As Integer = 0 To Columnas - 1 ' porque de  0 a 10 hay 11 elementos, no 10, restamos 1            Me.ListView1.Columns.Add("Columna" & Col.ToString, 120) ' texto y ancho             ' si la columna ya fue creada podemos usar estas otras líneas para modificar esos valores             '   ListView1.Columns(Col).Text = "Columna" & Col.ToString      ' texto de la columna            '   ListView1.Columns(Col).Width = 120                          ' ancho de la columna          Next        System.Windows.Forms.Application.DoEvents()        ReDim nuevaSubIt(0 To Columnas - 1)        For It As Byte = 0 To 9 ' 9 itemes            Me.ListView1.Items.Add("Item" & It.ToString) ' columna 0            System.Windows.Forms.Application.DoEvents()             For Col As Integer = 1 To Columnas - 1                nuevaSubIt(Col) = New Windows.Forms.ListViewItem.ListViewSubItem(ListView1.Items(It), "Item" & It.ToString & "_Columna" & Col.ToString)                 ' si ya han sido creado los subitems, usaríamos esta línea                'Me.ListView1.Items(It).SubItems(Col).Text = "Item" & It.ToString & "_Columna" & Col.ToString            Next            Me.ListView1.Items(It).SubItems.AddRange(nuevaSubIt)            System.Windows.Forms.Application.DoEvents()        Next    End SubEnd Class  
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.

giorgione:
Muchas gracias el codigo funciona

Navegación

[0] Índice de Mensajes

Ir a la versión completa