La siguiente línea me da un serio dolor de cabeza:

listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));

Todo lo que quiero hacer es insertar un elemento en una vista de lista. El control listview en modo detallado con grupos habilitado. El elemento insertado debe ir en el primer grupo en el índice 0.
Pero lo que sucede es que el objeto siempre se agrega como ÚLTIMO elemento en el grupo. Como si el primer parámetro de Insertar(…) no tuvo ningún efecto…

Nada de lo que me estoy perdiendo aquí?

BTW: la Clasificación está deshabilitado en el listview!

InformationsquelleAutor Boris | 2011-10-27

3 Comentarios

  1. 6

    Usted puede probar:

    ListViewItem item = new ListViewItem("Test");
    this.listView1.Items.Insert(0, item);
    this.listView1.Groups[0].Items.Insert(0, item);

    Una discusión detallada se puede encontrar aquí.

    Este ejemplo, se agrega tres grupos a un listview y añade elementos en la primera posición de los grupos:

    for (int groupIndex = 0; groupIndex < 3; ++groupIndex) {
       this.listView1.Groups.Add("GroupKey" + groupIndex, "Test" + groupIndex);
    
       for (int index = 0; index < 5; ++index) {
          ListViewItem item = new ListViewItem("Test " + groupIndex + "/" + index,
                                               this.listView1.Groups[groupIndex]);
          this.listView1.Items.Insert(0, item);
          this.listView1.Groups[groupIndex].Items.Insert(0, item);
        }
     }
    
     for (int groupIndex = 2; groupIndex >= 0; --groupIndex) {
        for (int index = 0; index < 5; ++index) {
          ListViewItem item = new ListViewItem("Test2 " + groupIndex + "/" + index,
                                               this.listView1.Groups[groupIndex]);
          this.listView1.Items.Insert(0, item);
          this.listView1.Groups[groupIndex].Items.Insert(0, item);
       }
     }

    Este es el resultado:
    La inserción de un elemento en un C# Winforms listview

    • Lo siento, me olvide de la línea de este.listView1.Elementos.Insert(0, item); he añadido un ejemplo.
    • He probado tu código de ejemplo, pero me da un resultado diferente de su captura de pantalla. Aquí Test2 siempre se inserta DESPUÉS de la Prueba1. Hu!?
    • Puedo ejecutar este ejemplo en Visual Studio 2010. Tal vez MS ha corregido un error?
    • A mí también, VS2010, .NET 4.0. Hizo algunos cambios en el listview propiedades?
    • Yo solo conjunto ViewMode=Detalles
    • Funciona ahora?
    • No, todavía no 🙁

  2. 2

    Algún tipo de magia, la

    si agrega un elemento a una vista de lista,
    y asignar el grupo G del elemento, el elemento se mostrará fuera de lugar.

    Ahora, si usted consigue el grupo que tiene el punto (G), cambio su nombre a algún valor temporal, para luego cambiar de nuevo a nombre original, todo lo que se mostrará OK.

    Así que en lugar de

    listView1.Items.Insert(0, new ListViewItem("Test", listView1.Groups[0]));

    hacer

    Dim LVI as new ListViewItem("Test")
    listView1.Items.Insert(0, LVI)
    LVI.Group = listView1.Groups[0]
    
    Dim TempStr as string = LVI.Group.Header
    LVI.Group.Header = "whatever"
    LVI.Group.Header = TempStr
  3. 1

    He tenido este problema también. Yo no estoy usando alguno de los grupos o de la clasificación. Aún así, si yo trato de insertar en cualquier índice, siempre mostrar el ÚLTIMO. Tuve que crear un «clasificador» que las fuerzas de la listview para utilizar siempre el mismo orden que los Elementos de la colección.

    class CompareByIndex : IComparer
    {
        private readonly ListView _listView;
    
        public CompareByIndex(ListView listView)
        {
            this._listView = listView;
        }
        public int Compare(object x, object y)
        {
            int i = this._listView.Items.IndexOf((ListViewItem)x);
            int j = this._listView.Items.IndexOf((ListViewItem)y);
            return i - j;
        }
    }

    y usarlo

       this.listView1.ListViewItemSorter = new CompareByIndex(this.listView1);

    Deseo que yo podría usar una expresión en vez de una clase auxiliar. Pero no puedo averiguar cómo.

    • Esto me ayudó, gracias. Sin embargo, la inserción de una nueva miniatura de la imagen en LargeImageList en un índice en particular es otra historia! Puede que tenga que crear una nueva ImageList y actualizar el listview.LargeImageList.

Dejar respuesta

Please enter your comment!
Please enter your name here