【问题标题】:VB.Net Delete data from Dictionary from SelectedValue in listboxVB.Net 从列表框中的 SelectedValue 中删除字典中的数据
【发布时间】:2019-02-17 23:04:04
【问题描述】:

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

【问题讨论】:

  • 一方面,如果Libraries.Remove(lstLibraries.SelectedValue) 甚至编译你必须有Option Strict Off,所以把它转为On 并修复得到标记的错误。
  • 您是否检查过SelectedValue 的值是否与Dictionary 中的某个键匹配?根据您的代码,我看不出它怎么可能,所以没有任何内容被删除也就不足为奇了。
  • 另外,在ListBox 中的每个项目前添加换行符有什么意义?这不是TextBox。无论如何,每个项目都显示在自己的行上,那么换行符可能有什么用途?
  • 你是对的,换行符没有意义,现在被删除了。但是,在转Option Strict On 之后,我仍然没有收到任何错误。
  • 我应该如何查看SelectedValue 是否匹配某个键?我应该通过字典执行for loop,然后在循环内执行if statement 以检查是否等于删除它的键?

标签: vb.net dictionary


【解决方案1】:

因为您正在使用 BOTH 键和​​值以及字符串“---”填充列表框,因此列表框的内容永远不会匹配 KEY 或 VALUE,但它会同时匹配 BOTH 并且仅使用相同的字符串“- ——”。

因此,当您测试相等性时,请测试您用于加载列表的相同相等性。

下面的代码可以工作,但可能可以进一步简化。 重要的不是它有效, 但它确实有效,并且您了解您出错的地方以及原因。

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

【讨论】:

  • 'this will be dropped是什么意思
  • 哦,我想我明白了,所以如果它等于所选项目的字符串,则它不会添加到临时库中,因此在更新以重新填充时不会包含在主 Libraries 中。谢谢!
  • 没问题 :) 很高兴能够提供帮助,因为我们都以同样的方式开始,作为初学者 :) 我们永远不会停止学习
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    如果要使用 SelectedValue,则需要设置 ValueMember。您需要使用 BindingSource 作为 DataSource 将 Libraries 绑定到 lstLibraries。然后,您可以使用现在是 SelectedValue 的 .Key 从库中删除。在 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
    

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2010-11-17
      • 1970-01-01
      • 2020-03-18
      相关资源
      最近更新 更多