Binglee2323
Binglee2323

Reputation: 41

Refreshing Listbox in VB.Net

I was wondering if there is any way to refresh the cont numbers in a listbox

i am adding data with the code

    ListBox1.Items.Add

I have set up as button to remove selected data with the code:

     For i As Integer = ListBox1.SelectedIndices.Count - 1 To 0 Step -1
        ListBox1.Items.RemoveAt(ListBox1.SelectedIndices.Item(i))
    Next

say my list box is like this

  1. Zach
  2. Barry
  3. John
  4. Nick
  5. Brodie

if i deleted say barry how can i make the numbers change so john would be 2. etc

Upvotes: 1

Views: 2943

Answers (3)

LarsTech
LarsTech

Reputation: 81610

The BindingList can be helpful here since it can listen for changes in the list.

For example, create a Person class and override the ToString function to show the rank and the name.

Public Class Person
  Property Name As String
  Property Rank As Integer

  Public Overrides Function ToString() As String
    Return Rank & ". " & Name
  End Function
End Class

In your form, declare the list and add the event handler:

Private people As New BindingList(Of Person)

Public Sub New()
  InitializeComponent()

  AddHandler people.ListChanged, AddressOf people_ListChanged
  people.Add(New Person() With {.Name = "Zach"})
  people.Add(New Person() With {.Name = "Barry"})
  people.Add(New Person() With {.Name = "John"})
  people.Add(New Person() With {.Name = "Nick"})
  people.Add(New Person() With {.Name = "Brodie"})
  ListBox1.DataSource = people
End Sub

Private Sub people_ListChanged(sender As Object, e As ListChangedEventArgs)
  For i As Integer = 0 To people.Count - 1
    people(i).Rank = i + 1
  Next
End Sub

The ListChanged event just updates the ranking of each member as they as slotted in the list, which will automatically update the ListBox since the DataSource is coming from the people list.

A simple delete button to test the list, and the rankings are automatically updated in the people list, which automatically updates the ListBox:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  If ListBox1.SelectedIndex > -1 Then
    people.Remove(ListBox1.SelectedItem)
  End If
End Sub

Upvotes: 1

dotNET
dotNET

Reputation: 35400

If you have some idea of GDI+ drawing, a more interesting approach is to set your ListBox's DrawMode to OwnerDrawFixed mode and listen to ListBox's DrawItem event, something like this:

C#

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    e.Graphics.DrawString((e.Index + 1).ToString() + ". " + listBox1.Items[e.Index].ToString(), listBox1.Font, Brushes.Black, e.Bounds);
    }

VB.NET

Private Sub listBox1_DrawItem(sender As Object, e As DrawItemEventArgs)
    e.DrawBackground()
    e.Graphics.DrawString((e.Index + 1).ToString() & ". " & listBox1.Items(e.Index).ToString(), listBox1.Font, Brushes.Black, e.Bounds)
End Sub

Adding or removing any items to the ListBox will automatically renumber all the items.

Upvotes: 1

David -
David -

Reputation: 2031

You can use a List of string combined with the ListBox.

Dim NamesList1 As New List(Of String)

Private Sub Form_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    NamesList1.AddRange({"Zach", "Barry", "John", "Nick", "Brodie"})
    FillListBoxItems()
End Sub

Private Sub FillListBoxItems()
    ListBox1.Items.Clear()

    For i As Integer = 0 To NamesList1.Count - 1
        ListBox1.Items.Add(i + 1 & ". " & NamesList1.Item(i))
    Next
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    For i As Integer = ListBox1.SelectedIndices.Count - 1 To 0 Step -1
        NamesList1.RemoveAt(ListBox1.SelectedIndices.Item(i))
    Next

    FillListBoxItems()
End Sub

Upvotes: 0

Related Questions