Vb.net 在对项目进行排序后,是否有办法保持列表框的索引顺序?

Vb.net 在对项目进行排序后,是否有办法保持列表框的索引顺序?,vb.net,listbox,Vb.net,Listbox,对于我的课程作业,我正在使用Visual Basic制作一个预订系统,该系统还存储有关未付款的数据,我使用列表框显示保存在一个数组中的注册客户的姓名,使用列表框项目的索引和数组的主键,例如: 数组: 用户ID 欠款 0 100 1. 0 2. 200 我建议使用另一种方法 将列表框的Sorted属性设置为True,并将客户列表分配给列表框的DataSource属性 现在,在列表框中,客户显示为已排序,但在列表中仍然未排序。我还建议将列表包装在BindingList中。它的优点是在添加或删除客户时

对于我的课程作业,我正在使用Visual Basic制作一个预订系统,该系统还存储有关未付款的数据,我使用列表框显示保存在一个数组中的注册客户的姓名,使用列表框项目的索引和数组的主键,例如:

数组:

用户ID 欠款 0 100 1. 0 2. 200
我建议使用另一种方法

将列表框的
Sorted
属性设置为
True
,并将客户列表分配给列表框的
DataSource
属性

现在,在列表框中,客户显示为已排序,但在列表中仍然未排序。我还建议将列表包装在
BindingList
中。它的优点是在添加或删除客户时自动更新列表框

您还必须重写Customer类的
ToString
方法,以使列表框以适当的方式显示它们:

Class Customer
    Public Property UserID As Integer
    Public Property AmountOwed As Decimal
    Public Property Name As String

    Public Overrides Function ToString() As String
        Return $"{Name} {UserID}, $={AmountOwed:n2}"
    End Function
End Class
形式如下(作为示例):


其思想是使用
客户绑定列表
,而不是使用
列表框
。从列表框中,您可以通过
SelectedItem
属性获取所选客户。这比使用索引更健壮。无论如何,您都不能将用户标识与任何索引保持同步。用户标识必须保持不变,以便您能够可靠地识别客户,而在添加或删除(或排序)客户时,索引将发生变化

不使用索引的删除函数示例:

Private Sub DeleteButton_Click(sender As Object, e As EventArgs) Handles DeleteButton.Click
    Dim customer = DirectCast(ListBox1.SelectedItem, Customer)

    customerBindingList.Remove(customer)
End Sub

您还可以将列表框的
DisplayMember
属性设置为“Name”,而不是覆盖
ToString

您可以将列表框的
ValueMember
属性设置为“UserID”。这使您能够使用

Dim id As Integer = DirectCast(ListBox1.SelectedValue, Integer)
Dim id As Integer = DirectCast(ListBox1.SelectedValue, Integer)