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

时间:2019-02-17 23:04:05

标签: vb.net dictionary

我无法从字典中删除数据。我希望单击builder = Gtk.Builder() builder.add_from_file("example.glade") window = builder.get_object("window") # Load list data. self.liststore = builder.get_object ("liststore") builder.connect_signals(self) window.show() def on_cell_toggled(self, widget, path): self.liststore[path][0] = not self.liststore[path][0] 按钮时从列表中删除列表框中突出显示的任何数据。删除后,它将使用更新的字典重新填充列表。

Delete Library

3 个答案:

答案 0 :(得分:1)

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

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

下面的代码有效,但可能可以进一步简化。 重要的不是它能起作用, 但是它可以正常工作,并且您可以了解哪里出了问题,为什么要这么做。

'
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
'

答案 1 :(得分:0)

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

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实际上将是字典中的键之一。

答案 2 :(得分:0)

如果要使用SelectedValue,则需要设置ValueMember。您需要使用BindingSource作为数据源将库绑定到lstLibraries。然后,您可以使用.Key(现在为SelectedValue)从库中删除。删除之后,再次调用您的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