我无法从字典中删除数据。我希望单击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
答案 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