Cita de: okik en 19 Enero 2019, 21:56 PMPero creo no voy mal encaminado de que se pudiera establecer una propiedad similar a un DataGridView, en cuanto a las "celdas" del Listview.
Hay un problema con ese tipo de pensamiento, y es que estás viendo el control ListView como si fuese similar a un DataGridView, a modo de columnas y celdas, pero el control ListView tiene varias vistas distintas, entre ellas la de tipo tabla/grid (más conocida como vista de detalles), sí, pero el control ListView no necesariamente tiene por que tener columnas creadas, y además, no hay límite de subitems que puedes crear para un item (más allá de los límites virtuales de memoria) indiferentemente de la cantidad de columnas que se haya creado, y estos subitems solo serán representados visualmente si el control tiene columnas creadas. Por estos motivos, pretender que automaticamente exista la misma cantidad de subitems que de columnas no tiene mucho sentido, ni aun usando la vista de detalles...
Cita de: okik en 19 Enero 2019, 21:56 PMSi creo tres columnas y creo un elemento de la colección mediante ADD, los elementos subitems de la misma file deberían crearse automáticamente.
Desde el primer momento te he dejado clara mi postura: esto me parece totalmente innecesario. Pero si quieres seguir con este enfoque, y por no dejarte sin una respuesta que te resulte satisfactoria pues aquí te muestro una solución que escrito donde implemento un ListView personalizado en el que sustituyo la colección base de items por una colección personalizada en la que reimplemento las funciones "Add" que se encargan de añadir el item en la colección...
Código (vbnet) [Seleccionar]
<DisplayName(NameOf(CustomListView))>
<Description("A custom ListView control.")>
<DesignTimeVisible(True)>
<DesignerCategory(NameOf(DesignerCategoryAttribute.Default))>
<ToolboxBitmap(GetType(ListView), "ListView.bmp")>
<ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)>
<ClassInterface(ClassInterfaceType.AutoDispatch)>
<ComVisible(True)>
<DefaultProperty(NameOf(CustomListView.Items))>
<DefaultEvent(NameOf(CustomListView.SelectedIndexChanged))>
<Docking(DockingBehavior.Ask)>
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")>
Public Class CustomListView : Inherits ListView
<DisplayName(NameOf(CustomListView.Items))>
<Description("The items in the ListView")>
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
<Localizable(True)>
<MergableProperty(False)>
<Browsable(True)>
Public Shadows ReadOnly Property Items As CustomListViewItemCollection
Public Sub New()
MyBase.New()
Me.Items = New CustomListViewItemCollection(Me)
End Sub
End Class
Código (vbnet) [Seleccionar]
<DefaultMember("Item")>
<ListBindable(False)>
Public Class CustomListViewItemCollection : Inherits ListViewItemCollection
Private ReadOnly owner As ListView
Public Sub New(owner As ListView)
MyBase.New(owner)
Me.owner = owner
End Sub
Public Overrides Function Add(value As ListViewItem) As ListViewItem
Return Me.CreateAllSubItems(MyBase.Add(value))
End Function
<DebuggerStepThrough>
Private Function CreateAllSubItems(value As ListViewItem) As ListViewItem
Dim diff As Integer = (Me.owner.Columns.Count - value.SubItems.Count)
If (diff > 0) Then
For i As Integer = 0 To (diff - 1)
value.SubItems.Add(String.Empty)
Next i
End If
Return value
End Function
End Class
Modo de empleo:
Código (vbnet) [Seleccionar]
Me.CustomListView1.View = System.Windows.Forms.View.Details
' Creamos 5 columnas.
For i As Integer = 1 To 5
Me.CustomListView1.Columns.Add(String.Format("Column {0}", i))
Next i
' Añadimos un item donde se crearán subitems o "celdas" vacías para las cinco columnas.
Me.CustomListView1.Items.Add("")
' Especificamos los valores de los cinco subitems
' sin necesidad de haber llamado al método SubItems.Add() para cada uno de ellos...
Me.CustomListView1.Items(0).SubItems(0).Text = "Value 1"
Me.CustomListView1.Items(0).SubItems(1).Text = "Value 2"
Me.CustomListView1.Items(0).SubItems(2).Text = "Value 3"
Me.CustomListView1.Items(0).SubItems(3).Text = "Value 4"
Me.CustomListView1.Items(0).SubItems(4).Text = "Value 5"
Esa sería la idea, ahora, el comportamiento que debería tener la clase CustomListView al eliminar una columna o añadir una nueva despues de que un item ya haya sido añadido, sería cosa tuya.
Saludos.