【问题标题】:Creating/Deleting Objects via Checking if Toggles in CheckListBox in VB.Net通过检查是否在 VB.Net 中的 CheckedListBox 中切换来创建/删除对象
【发布时间】:2020-04-12 02:53:42
【问题描述】:

我正在使用 CheckBoxes 中的一些 CheckedListItems,并且在确定何时通过其索引位置选中和/或取消选中特定选中产品时遇到问题。 我从 MsgBox 调试中知道,如果我选择 Product All purpose Cleaner 或 Cleaning Wipes,它会调用这两种方法的 MsgBoxes,尽管我尝试使用仅针对该特定产品执行的逻辑。不知何故,它认为我已经选择了这两个项目?

所以基本上我正在尝试这样做:

如果 CheckedListBox 中的第 0 项被选中 调用符合菜单以获得所需的数量,然后返回订购菜单。 未选中 CheckedListBox 中的 ElseIF 项目零 从当前订单中删除它。

这实际上是对我的 CheckedListBox 中的所有项目进行冲洗和重复。我怀疑 VB.NET 导致我的代码“失败”,它认为我选择的所有项目都是相同的,尽管我试图阻止这种情况。

我可以对此有一些想法吗?

谢谢。

Private Sub CleaningProductsList_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CleaningProductsList.SelectedIndexChanged

    Dim allPurposeCleaner = New AllPurposeCleaner()
    Dim cleaningCloths = New cleaningCloths()

    ' If checked.
    If CleaningProductsList.GetItemChecked(0) = True Then
        isChecked = True
        Me.Hide()
        ' MsgBox("All Purpose Cleaner Selected")
        AmountMenue.setGivenProduct(allPurposeCleaner)
        AmountMenue.Show()
        ' If unchecked.
    ElseIf CleaningProductsList.GetItemChecked(0) = False Then
        isChecked = False
        ' MsgBox("All Purpose Cleaner  UnSelected ")
        MsgBox(CleaningProductsList.GetItemChecked(0).ToString + " ALLPURPOSE UNCHECKED")
        AmountMenue.removedGivenProduct(allPurposeCleaner)
    End If

    ' If checked.
    If CleaningProductsList.GetItemChecked(1) = True Then
        Me.Hide()
        AmountMenue.setGivenProduct(cleaningCloths)
        MsgBox("cleaning cloths Selected ")
        AmountMenue.Show()
        ' If unchecked.
    ElseIf CleaningProductsList.GetItemChecked(1) = False And CleaningProductsList.CheckOnClick = False Then
        MsgBox("cleaning cloths  UnSelected ")
        MsgBox(CleaningProductsList.GetItemChecked(2).ToString + " Cleaning Cloths UNCHECKED")
        isChecked = False
        AmountMenue.removedGivenProduct(cleaningCloths)
    End If 
End Sub

【问题讨论】:

  • 如果CleaningProductsListCheckedListBox 那么SelectedIndexChanged 是首先要处理的错误事件。 CheckListBox 中的选择与常规 ListBox 中的选择方式完全相同,并且与检查毫无关系。如果您关心检查,请处理与检查相关的事件,即ItemCheck。请注意,该事件是在更改发生之前引发的。

标签: vb.net list listbox toggle checkedlistbox


【解决方案1】:

下面是一个示例,说明如何确定 CheckedListBox 中的更改:

Private checkedIndexes As New List(Of Integer)
Private checkedItems As New List(Of String)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    CheckedListBox1.Items.AddRange({"First", "Second", "Third", "Fourth", "Fifth"})
End Sub

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    If e.NewValue = CheckState.Checked Then
        'An item is being checked.
        checkedIndexes.Add(e.Index)
        checkedItems.Add(CStr(CheckedListBox1.Items(e.Index)))
    Else
        'An item is being unchecked.
        checkedIndexes.Remove(e.Index)
        checkedItems.Remove(CStr(CheckedListBox1.Items(e.Index)))
    End If

    Label1.Text = $"Checked indexes: {String.Join(", ", checkedIndexes)}"
    Label2.Text = $"Checked items: {String.Join(", ", checkedItems)}"
End Sub

e 参数通过Index 属性告诉您正在更改的项目,以及通过CurrentValueNewValue 属性更改的内容。

如果您想在该事件处理程序中获取已检查项目的完整列表,因为该事件在更改完成之前引发,您需要从控件提供的列表开始,然后添加或删除当前项目:

Dim checkedItems = CheckedListBox1.CheckedItems.Cast(Of String)().ToList()

If e.NewValue = CheckState.Checked Then
    checkedItems.Add(CStr(CheckedListBox1.Items(e.Index)))
Else
    checkedItems.Remove(CStr(CheckedListBox1.Items(e.Index)))
End If

'Use checkedItems here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2018-09-09
    • 1970-01-01
    • 2013-05-27
    • 2018-04-11
    相关资源
    最近更新 更多