Lo tienes prácticamente bien...
' 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)
Next
End 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.
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 Sub
End 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.