[英]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.