首页 > 解决方案 > 从字典中删除时的 Vb.net ArgumentNullException

问题描述

我遇到了一个问题,我试图从列表框中选定索引处的字典中删除一个元素。我向 a 添加了 3 个元素SortedDictionary并将它们打印到列表框中。我正在尝试从列表框中突出显示的字典中删除该项目,但是当我单击删除时,我得到了System.ArgumentNullException: 'Value cannot be null. Parameter name: key'我的 SubbtnDeleteLibrary_Click为什么会这样?

线路发生错误Libraries.Remove(lstLibraries.SelectedValue)

Public Class frmManager

    Dim Libraries As New SortedDictionary(Of String, String)

    Private Sub frmManager_Load(sender As Object, e As EventArgs) Handles Me.Load

        Libraries.Add("Zahnow Library", "SVSU")
        Libraries.Add("Fleschner Memorial Library", "BR")
        Libraries.Add("Scott D. James Technical Repository", "SDJ")

        lstLibraries.Items.Clear()

        populatelstLibrary()

    End Sub

    Sub populatelstLibrary()
        For Each library In Libraries
            lstLibraries.Items.Add(vbCrLf & library.Key & " --- " & library.Value)
        Next
    End Sub

    Private Sub btnDeleteLibrary_Click(sender As Object, e As EventArgs) Handles btnDeleteLibrary.Click

        Libraries.Remove(lstLibraries.SelectedValue)

        lstLibraries.Items.Clear()
        populatelstLibrary()

    End Sub

End Class    

标签: vb.netdictionary

解决方案


由于您正在为 ListBox 项目构建自定义显示字符串,因此很难将其直接映射到字典。

最简单的解决方案是创建一个存储在 ListBox 中的自定义类,并设置 ListBox 的DisplayMemberValueMember属性,告诉它如何显示每个项目以及在调用SelectedValue.

班级:

Public Class LibraryItem

    Public Property Name As String
    Public Property Code As String

    Public ReadOnly Property DisplayName As String
        Get
            Return vbCrLf & Me.Name & " --- " & Me.Code
        End Get
    End Property

    Public Sub New()
    End Sub

    Public Sub New(ByVal Name As String, ByVal Code As String)
        Me.Name = Name
        Me.Code = Code
    End Sub
End Class

最初设定:

Private Sub frmManager_Load(sender As Object, e As EventArgs) Handles Me.Load
    'Tell the ListBox which properties to use for display and value.
    lstLibraries.DisplayMember = "DisplayName"
    lstLibraries.ValueMember = "Name"

    'Your code...
End Sub

填充列表框:

Sub populatelstLibrary()
    For Each library In Libraries
        lstLibraries.Items.Add(New LibraryItem(library.Key, library.Value))
    Next
End Sub

现在SelectedValue将为您获取所选项目Name属性的值,该值对应于字典中的键。


推荐阅读