# Collections

Better ListView: Ultimate .NET ListView replacement control for WinForms (C#, VB.NET)
Download More Info

Better ListView contains several types collections of its elements (columns, items, sub-items, groups). These can be accessed via properties:

- Columns

- Items

- Groups

- BetterListViewItem.SubItems

- BetterListViewItem.ChildItems

Each of these collections are of type BetterListViewElementCollection<TItem> where TItem is collection element type. All these collection also implement IList<TItem>, ICollection<TItem> and their nongeneric companions.

They also implement extra functionality through IExtendedList<TItem>:

- AddRange

  - add set of items

- RemoveRange

  - remove subset of items

These collections are bound to Better ListView, so any modification to these collection will be projected into control state.

When the collection is created by user code, e.g.:

C#

    var myItems = new BetterListViewItemCollection();

Visual Basic

    Dim myItems = New BetterListViewItemCollection()

then the collection is not bound to the control and its state is independent on the control's state.

All the collections are both binary and XML serializable.

## Adding Elements

Specific collections provide several overrides for easy addition of items, for example:

C#

    myItems.Add("New Item");

Visual Basic

    myItems.Add("New Item")

Adds new item with text 'New Item' in the collection.

All Better ListView collections support adding arbitrary objects, for example:

C#

    var person = new Person("Mark Bradley", 13, Gender.Male);

    myItems.Add(person);

Visual Basic

    Dim person = New Person("Mark Bradley", 13, Gender.Male)

    myItems.Add(person)

This will create a new BetterListViewItem with Text property obtained from converting the Person object. The type can either provide custom TypeConverter, or default TypeConverter (for primive types) or ToString method is used for conversion.

Multiple custom items can be added either:

C#

    myItems.AddRange(new object[] { person1, person2, "New Person" });

Visual Basic

    myItems.AddRange(New Object() {person1, person2, "New Person"})

## Custom Type Conversion

You can add arbitrary objects to any Better ListView collection. Of course, the objects have to be converted to collection's item type (e.g. BetterListViewItem). If no additional code is provided, the Better ListView will create new item and fill it with text using Object.ToString() method. You can specify this text by providing ToString() method override. Here is a simple Person type providing custom ToString() method:

C#

    class Person
    {
        public string Name;
        public int Age;

        public override string ToString()
        {
            return Name;
        }
    }

Visual Basic

    Class Person

        Public Name As String
        Public Age As Integer

        Public Overrides Function ToString() As String
            Return Name
        End Function

    End Class

If you want more control over the conversion, you can provide a custom TypeConverter. The following sample code shows implementation of PersonConverter class that allows conversion from Person type to BetterListViewItem type:

C#

    class PersonConverter : TypeConverter
    {
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(BetterListViewItem))
            {
                return true;
            }

            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(BetterListViewItem))
            {
                Person person = (Person)value;

                // convert Person instance to BetterListViewItem instance
                return new BetterListViewItem(new string[] { person.Name, person.Age.ToString() });
            }

            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

Visual Basic

    Class PersonConverter
        Inherits TypeConverter
        Public Overrides Function CanConvertTo(context As ITypeDescriptorContext, destinationType As Type) As Boolean
            If destinationType = GetType(BetterListViewItem) Then
                Return True
            End If

            Return MyBase.CanConvertTo(context, destinationType)
        End Function

        Public Overrides Function ConvertTo(context As ITypeDescriptorContext, culture As CultureInfo, value As Object, destinationType As Type) As Object
            If destinationType = GetType(BetterListViewItem) Then
                Dim person As Person = DirectCast(value, Person)

                ' convert Person instance to BetterListViewItem instance
                Return New BetterListViewItem(New String() {person.Name, person.Age.ToString()})
            End If

            Return MyBase.ConvertTo(context, culture, value, destinationType)
        End Function
    End Class

Once you have the converter implemented, simply mark your custom type with TypeConverterAttribute and Better ListView will make use of the converter instead of just ToString() method:

C#

    [TypeConverter(typeof(PersonConverter))]
    class Person
    {
        public string Name;
        public int Age;

        public override string ToString()
        {
            return Name;
        }
    }

Visual Basic

    <TypeConverter(GetType(PersonConverter))> _
    Class Person
        Public Name As String
        Public Age As Integer

        Public Overrides Function ToString() As String
            Return Name
        End Function
    End Class

Note that TypeConverter is primarily used by Better ListView for conversion to collection's native type or to String. If the TypeConverter does not support conversion to String, the Object.ToString() method is used instead.

Finally, you can add such Person objects to Better ListView item collection and they will get converted automatically:

C#

    Person person = new Person();

    person.Name = "Jack Black";
    person.Age = 38;

    listView.Items.Add(person);

Visual Basic

    Dim person As New Person()

    person.Name = "Jack Black"
    person.Age = 38

    listView.Items.Add(person)

Other item additon methods like Insert, AddRange or InsertRange can be used as well.

Better ListView: Ultimate .NET ListView replacement control for WinForms (C#, VB.NET)
Download More Info