繁体   English   中英

VB.Net从列表框中的SelectedValue中删除字典中的数据

[英]VB.Net Delete data from Dictionary from SelectedValue in listbox

我无法从字典中删除数据。 我希望单击“ Delete Library按钮时,将列表框中突出显示的所有数据从字典中Delete Library 删除后,它将使用更新的字典重新填充列表。

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("SVSU", "Zahnow Library")
        Libraries.Add("BR", "Fleschner Memorial Library")
        Libraries.Add("SDJ", "Scott D. James Technical Repository")

        populatelstLibrary()

    End Sub

    Sub populatelstLibrary()

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

     End Sub

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

        Dim key As String = ""

        If lstLibraries.SelectedValue IsNot Nothing Then

            For Each library In Libraries
                key = library.Key
                If lstLibraries.SelectedValue.Equals(key) Then
                    Libraries.Remove(key)
                End If
            Next

            lstLibraries.Items.Clear()
            populatelstLibrary()

        End If

    End Sub

End Class

因为要用键和值以及字符串“ ---”填充列表框,所以列表框的内容将永远不匹配键或值,但将两者都匹配,并且只使用相同的字符串“ ---” 。

因此,在测试是否相等时,请测试与加载列表相同的相等性。

下面的代码有效,但可能可以进一步简化。 重要的不是它起作用了,而是它起作用了,并且您了解错误的原因以及原因。

'
Dim key As String = ""
Dim tmpLibraries As New SortedDictionary(Of String, String)

If lstLibraries.SelectedIndex > -1 Then

  For Each Item In Libraries
    If lstLibraries.SelectedItem.Equals(Item.Value & " --- " & Item.Key) Then
      'this will be dropped
    Else
      tmpLibraries.Add(Item.Value, Item.Key)
    End If
  Next

  lstLibraries.Items.Clear()
  Libraries = tmpLibraries
  tmpLibraries = Nothing
  PopulatelstLibraries()

End If
'

如果您希望能够根据选择内容按键删除项目,则选择需要提供该键。 做到这一点的逻辑方法是通过绑定,例如

With lstLibraries
    .DisplayMember = "Text"
    .ValueMember = "Key"
    .DataSource = Libraries.Select(Function(kvp) New With {.Key = kvp.Key, .Text = $"{kvp.Value} --- {kvp.Key}"}.ToArray()
End With

之后, SelectedValue实际上将是字典中的键之一。

如果要使用SelectedValue,则需要设置ValueMember。 您需要使用BindingSource作为数据源将库绑定到lstLibraries。 然后,您可以使用.Key(现在为SelectedValue)从库中删除。 在Remove之后,再次调用您的populatelstLibraries以使ListBox与Dictionary保持同步。

Dim Libraries As New SortedDictionary(Of String, String)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Libraries.Add("SVSU", "Zahnow Library --- SVSU")
    Libraries.Add("BR", "Fleschner Memorial Library --- BR")
    Libraries.Add("SDJ", "Scott D. James Technical Repository --- SDJ")
    populatelstLibrary()
End Sub

Sub populatelstLibrary()
    ListBox2.DataSource = New BindingSource(Libraries, Nothing)
    ListBox2.DisplayMember = "Value"
    ListBox2.ValueMember = "Key"
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Libraries.Remove(CType(ListBox2.SelectedValue, String))
    populatelstLibrary()
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM